diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index c96fd6ab5..41b6899cb 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive ENV \ DEBUG=false \ - NODE_VERSION=v12.22.4 \ + NODE_VERSION=v12.22.8 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ @@ -22,6 +22,7 @@ ENV \ ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \ ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \ ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \ + ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \ RICHER_CARD_COMMENT_EDITOR=false \ CARD_OPENED_WEBHOOK_ENABLED=false \ ATTACHMENTS_STORE_PATH="" \ @@ -195,6 +196,10 @@ COPY \ settings.json \ /home/wekan/app/ +COPY \ + tests \ + /home/wekan/app/tests/ + COPY \ packages \ /home/wekan/app/packages/ @@ -226,6 +231,19 @@ RUN \ chmod u+w package.json npm-shrinkwrap.json && \ npm install +USER root +# Cleanup +RUN \ + set -o xtrace && \ + apt-get clean -y && \ + apt-get autoremove -y && \ + rm -Rf /tmp/* && \ + rm -Rf /home/wekan/app_build && \ + rm -Rf /var/cache/apt /var/lib/apt/lists && \ + rm -Rf /var/lib/apt/lists/* + +USER wekan + ENV PORT=3000 EXPOSE $PORT WORKDIR /home/wekan/app diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index d1e91b858..67e85fcf7 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -12,9 +12,9 @@ services: expose: - 27017 volumes: + - /etc/localtime:/etc/localtime:ro - ./volumes/wekan-db:/data/db - ./volumes/wekan-db-dump:/dump - - /etc/localtime:/etc/localtime:ro wekan-dev: container_name: wekan-dev-app @@ -36,19 +36,13 @@ services: depends_on: - wekandb-dev volumes: + - /etc/localtime:/etc/localtime:ro - ../client:/home/wekan/app/client - ../models:/home/wekan/app/models - ../config:/home/wekan/app/config - ../i18n:/home/wekan/app/i18n - ../server:/home/wekan/app/server - ../public:/home/wekan/app/public - - /etc/localtime:/etc/localtime:ro - -volumes: - wekan-dev-db: - driver: local - wekan-dev-db-dump: - driver: local networks: wekan-dev-tier: diff --git a/.eslintrc.json b/.eslintrc.json index 97ed9297b..4c862c827 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -122,6 +122,7 @@ "Activities": true, "Attachments": true, "Boards": true, + "CardCommentReactions": true, "CardComments": true, "DatePicker": true, "Cards": true, @@ -156,6 +157,7 @@ "Integrations": true, "HTTP": true, "AccountSettings": true, + "TableVisibilityModeSettings": true, "Announcements": true, "Swimlanes": true, "ChecklistItems": true, diff --git a/.future-snap/broken-snapcraft.yaml b/.future-snap/broken-snapcraft.yaml index d57880c54..509ef5160 100644 --- a/.future-snap/broken-snapcraft.yaml +++ b/.future-snap/broken-snapcraft.yaml @@ -81,7 +81,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 12.22.4 + node-engine: 12.22.8 node-packages: - node-gyp - node-pre-gyp diff --git a/.future-snap/snapcraft.yaml b/.future-snap/snapcraft.yaml index 94ddbbadd..00f28001a 100644 --- a/.future-snap/snapcraft.yaml +++ b/.future-snap/snapcraft.yaml @@ -83,7 +83,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 12.22.4 + node-engine: 12.22.8 node-packages: - node-gyp - node-pre-gyp diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 0418c1bf4..ee82af2ea 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,12 +1,13 @@ ## Issue -Note: With Docker, please don't use latest tag. Only use release tags. -See https://github.com/wekan/wekan/issues/3874 +**[PLEASE UPGRADE](https://github.com/wekan/wekan/wiki/Backup)** to newest WeKan ® before adding new issue !! +- We get too many duplicate reports of already fixed bugs. Newest WeKan ® has newest bugfixes and security fixes. +- Please search existing Open and Closed issues, most questions have already been answered many times. If you can not login for any reason: - https://github.com/wekan/wekan/wiki/Forgot-Password -Email settings: +Email settings, only SMTP MAIL_URL and MAIL_FROM are in use: - https://github.com/wekan/wekan/wiki/Troubleshooting-Mail Add these issues to elsewhere: @@ -20,14 +21,12 @@ Other Wekan issues can be added here. * Note: Please anonymize info, and do not add to this public issue any of your Wekan board URLs, passwords, API tokens etc, do you understand?: * Did you test in newest Wekan?: * For new Wekan install, did you configure root-url correctly so Wekan cards open correctly https://github.com/wekan/wekan/wiki/Settings ? -* Wekan version: -* If this is about old version of Wekan, what upgrade problem you have?: * Operating System: -* Deployment Method(snap/docker/sandstorm/mongodb bundle/source): +* Deployment Method(Snap/Docker/Sandstorm/bundle/source): * Http frontend if any (Caddy, Nginx, Apache, see config examples from Wekan GitHub wiki first): -* Node Version: +* Node.js Version: * MongoDB Version: -* Wekan only works on newest desktop Firefox/Chromium/Chrome/Edge/Chromium Edge and mobile Chrome. What webbrowser version are you using? +* Wekan works on newest desktop and mobile webbrowsers that support Javascript. What webbrowser version are you using? **Problem description**: - *REQUIRED: Add recorded animated gif about how it works currently, and screenshot mockups how it should work. Use peek to record animgif in Linux https://github.com/phw/peek* diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 000000000..234f3eaaf --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,63 @@ +name: Docker + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + schedule: + - cron: '28 23 * * *' + push: + branches: [ master ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ master ] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }} + + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..74f5c74a4 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release Charts + +on: + push: + branches: + - master + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Configure Git + run: | + git config user.name "$GITHUB_ACTOR" + git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + + - name: Run chart-releaser + uses: helm/chart-releaser-action@v1.1.0 + env: + CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.gitignore b/.gitignore index 0d8901ffb..e30d6282f 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ ehthumbs.db # Helm chart # Chart dependencies /helm/wekan/**/*.tgz +/helm/wekan/charts diff --git a/.meteor/packages b/.meteor/packages index 40e3c7213..10d89875e 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -60,11 +60,10 @@ reactive-var@1.0.11 fortawesome:fontawesome mousetrap:mousetrap mquandalle:jquery-textcomplete -mquandalle:jquery-ui-drag-drop-sort mquandalle:mousetrap-bindglobal peerlibrary:blaze-components@=0.15.1 templates:tabs -verron:autosize +meteor-autosize simple:json-routes rajit:bootstrap3-datepicker shell-server@0.5.0 diff --git a/.meteor/versions b/.meteor/versions index d78e3a94f..0f1be0e1d 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -76,6 +76,7 @@ matb33:collection-hooks@0.9.1 matteodem:easy-search@1.6.4 mdg:validation-error@0.5.1 meteor@1.9.3 +meteor-autosize@5.0.1 meteor-base@1.4.0 meteor-platform@1.2.6 meteorhacks:aggregate@1.3.0 @@ -106,7 +107,6 @@ mquandalle:collection-mutations@0.1.0 mquandalle:jade@0.4.9 mquandalle:jade-compiler@0.4.5 mquandalle:jquery-textcomplete@0.8.0_1 -mquandalle:jquery-ui-drag-drop-sort@0.2.0 mquandalle:moment@1.0.1 mquandalle:mousetrap-bindglobal@0.0.1 msavin:usercache@1.8.0 @@ -219,7 +219,6 @@ url@1.3.2 useraccounts:core@1.14.2 useraccounts:flow-routing@1.14.2 useraccounts:unstyled@1.14.2 -verron:autosize@3.0.8 webapp@1.10.1 webapp-hashing@1.1.0 wekan-accounts-cas@0.1.0 diff --git a/.travis.yml b/.travis.yml index 9887c8fc6..059e8bbe4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: required env: TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0 - TRAVIS_NODE_VERSION: 12.22.4 + TRAVIS_NODE_VERSION: 12.22.8 TRAVIS_NPM_VERSION: latest before_install: diff --git a/.tx/config b/.tx/config index 7ff185a9e..b459a649f 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, de_CH:de-CH, en_IT:en-IT, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK +lang_map = ar_EG:ar-EG, bg_BG:bg, de_AT:de-AT, de_CH:de-CH, en_DE:en-DE, en_IT:en-IT, 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-GR, fa_IR:fa-IR, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, gu_IN:gu-IN, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK [wekan.application] file_filter = i18n/.i18n.json diff --git a/CHANGELOG.md b/CHANGELOG.md index cfcecec54..940b195b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,717 @@ [Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac) -Note: With Docker, please don't use latest tag. Only use release tags. -See https://github.com/wekan/wekan/issues/3874 +# v5.85 2021-12-17 WeKan ® release + +This release adds the following updates: + +- [Updated to Node.js v12.22.8](https://github.com/wekan/wekan/commit/5ad9ee1de6446e3b2f3e4a5df207d12de76e1b95). + Thanks to Node.js developers. + +and fixes the following bugs: + +- [Fix mobile card details for Modern Dark theme](https://github.com/wekan/wekan/pull/4240). + Thanks to jghaanstra. +- [Fixed undefinded added member to board](https://github.com/wekan/wekan/pull/4245). + Thanks to Emile840. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.84 2021-12-15 WeKan ® release + +This release adds the following new features: + +- [Kubernetes 1.22 support and basic helm test](https://github.com/wekan/wekan/pull/4208). + Thanks to varac. +- [Added Helm Chart usage docs](https://github.com/wekan/wekan/pull/4224). + Thanks to varac. +- [Add full name if exists in `email-invite-subject` for user to invite](https://github.com/wekan/wekan/pull/4226). + Thanks to Emile840. +- [Sort Organizations, Teams and People](https://github.com/wekan/wekan/pull/4232). + Thanks to Emile840. + +and fixes the following bugs: + +- [List title doesn't overlap with hamburger menu anymore](https://github.com/wekan/wekan/pull/4203). + Thanks to mfilser. +- [Fix legal notice traduction bug when refreshing sign in page](https://github.com/wekan/wekan/pull/4217). + Thanks to Emile840. +- [Fix: Clicking to view Lists or Swimlanes Archive adds temporarily many empty Lists to board](https://github.com/wekan/wekan/pull/4221). + Thanks to Ben0it-T. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.83 2021-11-30 WeKan ® release + +This release adds to following new improvements: + +- [Changed delete checklist dialog to a popup](https://github.com/wekan/wekan/pull/4200). + Thanks to mfilser. +- [Dragging minicards scrolls now vertically at the end of the screen](https://github.com/wekan/wekan/pull/4201). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.82 2021-11-29 WeKan ® release + +This release removes the following new features: + +- [Revert change from WeKan v5.81: At Sandstorm, every WeKan user is now WeKan Admin and has Admin Panel](https://github.com/wekan/wekan/commit/ebc7741fcb9ad854234921ed0546255411adeec9). + Thanks to ocdtrekkie and xet7. + +and adds the following new features: + +- [List header contains now a button to add the card to the bottom of the list](https://github.com/wekan/wekan/pull/4195). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.81 2021-11-29 WeKan ® release + +This release adds the following new features: + +- [At Sandstorm, every WeKan user is now WeKan Admin and has WeKan Admin Panel. This could help export, board member permissions, etc](https://github.com/wekan/wekan/commit/23a2e90f5f553c2051978a0b4cd5b0d6d4ee03da). + Thanks to PizzaProgram and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.80 2021-11-26 WeKan ® release + +This release adds the following new features: + +- [Show helper at label drag/drop if label popup opened from card details popup](https://github.com/wekan/wekan/pull/4176). + Thanks to mfilser. +- [Show or hide members and assignee(s) on minicard](https://github.com/wekan/wekan/pull/4179). + Thanks to Ben0it-T. +- [List adding has now a cancel button](https://github.com/wekan/wekan/pull/4183). + Thanks to mfilser. +- [CustomFields Currency, autofocus on edit](https://github.com/wekan/wekan/pull/4189). + Thanks to mfilser. +- [Attachments, show file size in KB in card details](https://github.com/wekan/wekan/pull/4191). + Thanks to mfilser. +- [Sidebar Member Settings Popup has now a Popup title](https://github.com/wekan/wekan/pull/4190). + Thanks to mfilser. +- [Add copy text button to most textarea fields](https://github.com/wekan/wekan/pull/4185). + Thanks to mfilser. +- Copy text button at most textarea fields is now translatable. + [Part 1](https://github.com/wekan/wekan/commit/5088c122536e13b44cf2fdbcfabeefd00cee332e), + [Part 2](https://github.com/wekan/wekan/commit/96465ac664c526d8749dcad158704b512317e256). + Thanks to xet7. + +and adds the following updates: + +- [Docker build script to be executeable](https://github.com/wekan/wekan/commit/8054f2b0025c4cb3f6a3ddf71754ae7c707d6ac0). + Thanks to xet7. +- [Drag drop jquery-ui update + screen and list scroll](https://github.com/wekan/wekan/pull/4181). + Thanks to mfilser. +- [Settings, add some space between radio buttons](https://github.com/wekan/wekan/pull/4186). + Thanks to mfilser. + +and fixes the following bugs: + +- [Default Top Left Corner Logo Image display few seconds before a display of custom Top Left Corner Logo Image](https://github.com/wekan/wekan/issues/4173). + Thanks to Emile840. +- [App reconnect link wasn't clickable](https://github.com/wekan/wekan/pull/4180). + Thanks to mfilser. +- [Copy card URL works now again](https://github.com/wekan/wekan/pull/4184). + Thanks to mfilser. +- [Fix: On mobile infinite scrolling didn't work](https://github.com/wekan/wekan/pull/4187). + Thanks to mfilser. +- [Custom Field StringTemplates didn't save the last input value on touch devices](https://github.com/wekan/wekan/pull/4188). + Thanks to mfilser. +- [Move cards to top/bottom ignores the current filter if active](https://github.com/wekan/wekan/pull/4192). + Thanks to mfilser. +- [Moving many cards with multi selection drag/drop to another list keeps the card order](https://github.com/wekan/wekan/pull/4193). + Thanks to mfilser. +- [Sidebar multi selection actions keep now the card sorting (cards moving, cards to archive etc)](https://github.com/wekan/wekan/pull/4194). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.79 2021-11-25 WeKan ® release + +This release fixes the following bugs: + +- [Fix label width oversize bug](https://github.com/wekan/wekan/pull/4157). + Thanks to mfilser. +- [Fixed label popup at desktop view (add and remove labels)](https://github.com/wekan/wekan/pull/4170). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.78 2021-11-17 WeKan ® release + +This release fixes the following bugs: + +- [Fix: Sandstorm WeKan Admin Panel version info broken](https://github.com/wekan/wekan/commit/02b6df320fc98e18e5a97105a35196bdffec98bb). + Thanks to ocdtrekkie and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.77 2021-11-16 WeKan ® release + +This release adds the following updates: + +- [Updated Docker Ubuntu base image](https://github.com/wekan/wekan/commit/b1b12b05b571f4eebd38e7486dea28dfd97a885d). + Thanks to Ubuntu developers. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.76 2021-11-16 WeKan ® release + +This release adds the following new features: + +- [Global search load card details](https://github.com/wekan/wekan/pull/4142). + Thanks to mfilser. +- [Layout improvement: Adding organisations to the board](https://github.com/wekan/wekan/pull/4143). + Thanks to Ben0it-T. +- [App reconnect is now possible if the connection was interrupted](https://github.com/wekan/wekan/pull/4147). + Thanks to mfilser. +- [Boards view has now drag handles at desktop view if drag handles are enabled](https://github.com/wekan/wekan/pull/4149). + Thanks to mfilser. +- [Account configuration of option loginExpirationInDays is now possible](https://github.com/wekan/wekan/pull/4150). + Thanks to mfilser. +- [Part 2: Added remaining of Account configuration of option loginExpirationInDays for Snap](https://github.com/wekan/wekan/commit/17d90684bb59fd4159f80b2da224638824151c6f). + Thanks to xet7. +- [Improve multi selection sidebar opening and closing](https://github.com/wekan/wekan/pull/4153). + Thanks to marook. + +and adds the following updates: + +- [Added release scripts for building local Docker images and pushing them to Quay.io and Docker Hub](https://github.com/wekan/wekan/commit/49c4dd8b14d9c13a9ae2aa18b37238a05ed41f92). + Thanks to xet7. + +and fixes the following bugs: + +- [Fixed trim whitespace at multiline editor fields](https://github.com/wekan/wekan/pull/4146). + Thanks to mfilser. +- [Fixed placeholder was not visible at list view (mobile view)](https://github.com/wekan/wekan/pull/4148). + Thanks to mfilser. +- [Fix list adding to bottom](https://github.com/wekan/wekan/pull/4152). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.75 2021-11-12 WeKan ® release + +This release adds the following new features: + +- [Card popup close color remove move bottom delete](https://github.com/wekan/wekan/pull/4138). + Thanks to mfilser. +- [Comment edit has now a cancel button](https://github.com/wekan/wekan/pull/4139). + Thanks to mfilser. +- [Checklist and items drag drop scrollable mobile view](https://github.com/wekan/wekan/pull/4140). + Thanks to mfilser. + +and adds the following updates: + +- [Updated release scripts](https://github.com/wekan/wekan/commit/936d9fe30697e4651cba04d505393e05f8c902c1). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.74 2021-11-11 WeKan ® release + +This release fixes the following bugs: + +- [Docker fix failed export and timezone](https://github.com/wekan/wekan/pull/4137). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.73 2021-11-11 WeKan ® release + +This release adds the following new features: + +- [Added NodeJS Statistics to Admin Panel/Versio](https://github.com/wekan/wekan/pull/4118). + Thanks to Ben0it-T. +- [Card detail popup loads now comments if opened from board search](https://github.com/wekan/wekan/pull/4128). + Thanks to mfilser. + +and adds the following updates: + +- Updated dependencies + [Part 1](https://github.com/wekan/wekan/commit/cf6713a31c9f6ce9d30832ee6bf6c95d35d7044b), + [Part 2](https://github.com/wekan/wekan/commit/ac7ef4d4cd7179a140f0c56c7c7d1ffc33e75fbe). + Thanks to developers of dependencies. + +and fixes the following bugs: + +- [Card Details, add missing hr line before Activity title](https://github.com/wekan/wekan/pull/4117). + Thanks to Ben0it-T. +- [Sidebar search only opens the card as popup on mobile view](https://github.com/wekan/wekan/pull/4122). + Thanks to mfilser. +- [Fixed a bug related to the default text of the OIDC button](https://github.com/wekan/wekan/pull/4132). + Thanks to Emile840. +- [Fix: Impossible to export board to excel where title exceeding 31 chars](https://github.com/wekan/wekan/pull/4135). + Thanks to Ben0it-T. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.72 2021-10-31 WeKan ® release + +This release adds the following new features: + +- [Add a possibility for non-admin users (who have an email on a given domain name in Admin Panel) to invite new users for registration](https://github.com/wekan/wekan/pull/4107). + Thanks to Emile840. + +and fixes the following bugs: + +- [Try to fix: Filter List by Title - Hide empty lists in Swimlane view](https://github.com/wekan/wekan/pull/4108). + Thanks to Ben0it-T. +- [Card labels on minicard withouth text are now at the same line again](https://github.com/wekan/wekan/pull/4109). + Thanks to mfilser. +- [Rename "Domaine" to "Domain" that is more like English](https://github.com/wekan/wekan/commit/c136033c1fb25688d310b1b62841003f3901641a). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.71 2021-10-29 WeKan ® release + +This release adds the following updates: + +- [Updated dependencies](https://github.com/wekan/wekan/commit/df2a2aae1d44ba22563cc28bc8d9baac71b2ced7). + Thanks to developers of dependencies. + +and fixes the following bugs: + +- [Fix: Filter List by Card Title](https://github.com/wekan/wekan/pull/4105). + Thanks to Ben0it-T. +- Add info about upgrades to GitHub issue template. + [Part 1](https://github.com/wekan/wekan/commit/46a5eec7d21b66eb1aacac4fec84a0d0a0f4d16b), + [Part 2](https://github.com/wekan/wekan/commit/7cc35970a849c19d35b89cf0a5fb91216a66fcb3). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.70 2021-10-28 WeKan ® release + +This release fixes the following bugs: + +- [Fix bug related to Admin Panel teams management](https://github.com/wekan/wekan/pull/4103). + Thanks to Emile840. +- Docker: Try to fix "Failed export and unexpected container restart". Added timezone and localtime. + [Part 1](https://github.com/wekan/wekan/commit/ec33d0b34f3abe5634be0b87f03314c738c771d1), + [Part 2](https://github.com/wekan/wekan/commit/e3292dd5627f95d59d130a8c1b9a62df317ae6bd). + Thanks to akitzing, mfilser and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.69 2021-10-28 WeKan ® release + +This release adds the following updates: + +- [Updated Docker base image to Ubuntu 21.10 Impish](https://github.com/wekan/wekan/commit/5411113544f040cab2df86234745e4846029660f). + Thanks to Ubuntu developers. + +and fixes the following bugs: + +- [Fix Docs: Only MAIL_URL and MAIL_FROM for email settings. Not Admin Panel anymore](https://github.com/wekan/wekan/commit/d9adce7b676b705da786eb44cd2c2c4dba120d30). + Thanks to niklasdahlheimer. +- [Popup fixes: Archive cards, upload attachements etc](https://github.com/wekan/wekan/pull/4101). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.68 2021-10-27 WeKan ® release + +This release adds the following new features: + +- [Labels are now drag/drop/sortable](https://github.com/wekan/wekan/pull/4084). + Thanks to mfilser. + +and fixes the following bugs: + +- [Fix labels desktop view add and delete](https://github.com/wekan/wekan/pull/4087). + Thanks to mfilser. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.67 2021-10-27 WeKan ® release + +This release fixes the following bugs: + +- [Fix typo](https://github.com/wekan/wekan/commit/cb9b8d4f2b8e24475a2aafd6f9653f28f305eefb). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.66 2021-10-27 WeKan ® release + +This release adds the following new features: + +- [api.py: List All Public Boards](https://github.com/wekan/wekan/commit/eac102dbbf302ccc121bbf1e4e8faf115e1f9da8). + Thanks to xet7. +- [api.py: List Custom Fields of Board](https://github.com/wekan/wekan/commit/bcf35731316c327090a8513a4c4094e32e301e3f). + Thanks to xet7. +- [api.py: Info of one Custom Field](https://github.com/wekan/wekan/commit/5c571ca8638c29e558f3a196daf5458274eb715e). + Thanks to xet7. +- [api.py: Add Custom Fields to Board. Does not work yet, error: Settings must be object](https://github.com/wekan/wekan/commit/3921209c9fbf1d908f2ef3e97dade5863a000309). + Thanks to xet7. +- [Add full name if exists in email-invite-subject or when tagging someone with `@` while commenting a card](https://github.com/wekan/wekan/pull/4057). + Thanks to Emile840. +- [Popup sorting number](https://github.com/wekan/wekan/pull/4060). + Thanks to mfilser. +- [At mobile view the card details are opened as Popup](https://github.com/wekan/wekan/pull/4062). + Thanks to mfilser. +- [Add card button has now a cancel button](https://github.com/wekan/wekan/pull/4067). + Thanks to mfilser. +- [Global search checklistitems and custom fields boolean](https://github.com/wekan/wekan/pull/4074). + Thanks to mfilser. +- [Board View, sort cards button also in mobile view](https://github.com/wekan/wekan/pull/4076). + Thanks to mfilser. +- [Minicard label popup](https://github.com/wekan/wekan/pull/4079). + Thanks to mfilser. +- [Re-enables custom schemes auto linking](https://github.com/wekan/wekan/commit/f67a174c4a7706a2d419ba3dd43d696104f90696). + Thanks to chrisi51. +- [Board search remove limit](https://github.com/wekan/wekan/pull/4082). + Thanks to mfilser. +- [Add a possibility of selecting displayed users in Admin Panel](https://github.com/wekan/wekan/pull/4083). + Thanks to Emile840. + +and adds the following updates: + +- Updated dependencies. + [Part 1](https://github.com/wekan/wekan/commit/f14e710ac0d5381ec092c9f383b9b68f446cab4d), + [Part 2](https://github.com/wekan/wekan/commit/156c0b5d4d91dae2ee9b12ed8c312dc19a3c3075). + Thanks to developers of dependencies. +- [Added npm publish script for releases](https://github.com/wekan/wekan/commit/2666b30ba911da8502153be5827f277b81354f8b). + Thanks to xet7. + +and fixes the following bugs: + +- [Fix infinite loading of public boards](https://github.com/wekan/wekan/pull/4053). + Thanks to mfilser. +- [Fix: Setting overtime not working](https://github.com/wekan/wekan/pull/4056). + Thanks to Ben0it-T. +- [Fix main scrollbar](https://github.com/wekan/wekan/pull/4063). + Thanks to mfilser. +- [Try to fix orphanedAttachments](https://github.com/wekan/wekan/commit/6a06522777a0bfa2f758e96c2d25e1237a7b43dc). + Thanks to Madko and xet7. +- [Fix markdown header quick access](https://github.com/wekan/wekan/pull/4065). + Thanks to mfilser. +- [Fix Filter List by Card Title](https://github.com/wekan/wekan/pull/4066). + Thanks to Ben0it-T. +- [Fix long textarea editing](https://github.com/wekan/wekan/pull/4068). + Thanks to mfilser. +- [Boards weren't loaded because of missing filter](https://github.com/wekan/wekan/pull/4069). + Thanks to mfilser. +- [Fix Card details Custom Fields popup empty hr sections and plus icon](https://github.com/wekan/wekan/pull/4070). + Thanks to mfilser. +- [Card popup search and global search improvements](https://github.com/wekan/wekan/pull/4071). + Thanks to mfilser. +- [Comment out showing Search All Boards logs in console](https://github.com/wekan/wekan/commit/a62a177fb1cdf8b823b5c32380a81e803e0049e7). + Thanks to mfilser and xet7. +- [Long labels on card and minicard are wrapped if too long](https://github.com/wekan/wekan/pull/4073). + Thanks to mfilser. +- [Card dates, if deleted rules didn't apply on "unset date fields"](https://github.com/wekan/wekan/pull/4075). + Thanks to mfilser. +- [Comment, added confirm delete popup](https://github.com/wekan/wekan/pull/4077). + Thanks to mfilser. +- [Fix: Filter List by Card Title](https://github.com/wekan/wekan/pull/4078). + Thanks to Ben0it-T. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.65 2021-10-12 WeKan ® release + +This release adds to following CRITICAL SECURITY UPDATES: + +- [Updated to Node.js v12.22.7](https://github.com/wekan/wekan/commit/64fc2e5d8fe50115175d44c01f7fca4e668c7231). + Thanks to Node.js developers. + +and fixes the following bugs: + +- [Excel Export: Export only comments for cards that are not linked](https://github.com/wekan/wekan/pull/4047). + Thanks to Ben0it-T. +- [If OIDC button text was customized, the default text will be added if a user click on `Sign In`](https://github.com/wekan/wekan/pull/4052). + Thanks to Emile840. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.64 2021-10-09 WeKan ® release + +This release adds the following new features: + +- [Excel Export : add board description, add comments worksheet](https://github.com/wekan/wekan/pull/4045). + Thanks to Ben0it-T. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.63 2021-10-07 Wekan release + +This release adds the following new features: + +- [Allow setting custom kubernetes labels when using the helm chart](https://github.com/wekan/wekan/pull/4031). + Thanks to ariep. + +and fixes the following bugs: + +- [Fixed SMTP by reverting MAIL_SERVICE changes](https://github.com/wekan/wekan/commit/9c99c5c3ae8d291df5305b3b6cd1825fc5cc2c21). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.62 2021-10-04 Wekan release + +This release adds the following new features: + +- [Allow word match for rules -> title filter](https://github.com/wekan/wekan/pull/4025). + Thanks to ilvar. +- [CSV/TSV/Excel Export translatable and fixed, CSV semicolon option added](https://github.com/wekan/wekan/pull/4028). + Thanks to Ben0it-T. +- Added week numbers to dates at card, minicard, Custom Field dates, DatePicker and Calendar. + [Part 1](https://github.com/wekan/wekan/commit/d06ac09485dafb0256ae7fbe613ab2dbe00b70f3), + [Part 2](https://github.com/wekan/wekan/commit/9e6744d1e33b37e0d23eea5869ccac3ff37f7d53). + Thanks to xet7. +- [Confirm Archive Card](https://github.com/wekan/wekan/commit/6c3fcdcc4c446fd4c8dc4dca1b2846f6e3ea72e4). + Thanks to xet7. + +and fixes the following bugs: + +- [Clean up /tmp after Docker build. This drastically reduces docker image size from ~280 MB to ~180 MB](https://github.com/wekan/wekan/pull/4026). + Thanks to ilvar. +- [Removed extra quotes from Export menu](https://github.com/wekan/wekan/commit/553652556468ac88c0691d4d688d5a922ef6a0c2). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.61 2021-09-25 Wekan release + +This release adds the following new features: + +- [Search by name or username or emails address when adding a new user to a board](https://github.com/wekan/wekan/pull/4018). + Thanks to Emile840. + +and fixes the following bugs: + +- [Fixed REST API, it shoud work now by Admin user](https://github.com/wekan/wekan/commit/e3a0dea85fa1f8e2f580f419b30cf5f36775d731). + Reverted [Allow board members to use more of API of Wekan v5.35](https://github.com/wekan/wekan/commit/a719e8fda1f78bcbf9af6e7b4341f8be1d141e90). + Thanks to tomhughes and xet7. +- [Wekan Gantt GPL: Fix Tasks not displayed in Gantt screen](https://github.com/wekan/wekan-gantt-gpl/commit/72d464f5eb55501f08eb0cfd31fd5340380d7f3b). + Thanks to MrLovegreen and khjde1207. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.60 2021-09-22 Wekan release + +This release adds the following new features: + +- [Toggle opened card Custom Fields layout between Grid and one per row](https://github.com/wekan/wekan/commit/fc2fb9a081021663cc822bf2a687fda74cd0afa6). + Thanks to xet7. + +and adds the following updates: + +- [Updated Docker base image to newer Ubuntu](https://github.com/wekan/wekan/commit/442e6bf983ada47c26a15dbc1982c554118fa84d). + Thanks to xet7. +- [Try to add Docker image to GitHub Docker Image Registry](https://github.com/wekan/wekan/commit/70ba1eca787671879215726c16335a84e2b636c9). + Thanks to xet7. +- [Update build scripts to install npm from NodeSource, and meteor with npm](https://github.com/wekan/wekan/commit/c062621dd5486b60bdd200a9279a38b98fc0d410). + Thanks to Meteor developers. + +and fixes the following bugs: + +- [Try to fix Bug: Card number equal to #0 when creating a sub-task from a card](https://github.com/wekan/wekan/commit/4c659da5334641f558e77285f7ca47e562f7c853). + Thanks to marcungeschikts, olivierlambert and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.59 2021-09-17 Wekan release + +This release adds the following new features: + +- [Admin Panel/People: Possibility of adding a team to all selected users](https://github.com/wekan/wekan/pull/3996). + Thanks to Emile840. +- [Add / remove team members as board members when adding / removing team from board](https://github.com/wekan/wekan/pull/4000). + Thanks to Emile840. +- [Added more translations to: Admin Panel/People: Possibility of adding a team to all selected users](https://github.com/wekan/wekan/commit/3d9b7eb7ab41c6450b473f6f349d894f516c5487). + Thanks to xet7. +- [Enter new password 2 times when registering](https://github.com/wekan/wekan/commit/0da84f8f3eb91c5bf726e058f5ec74a7891d734b). + Thanks to sh2515 and xet7. +- Sum of cards. In Progress, not ready yet. + [Part 1: Add Custom Field options for field sum](https://github.com/wekan/wekan/commit/8626b466b830adf6c671211bbd61b53b96ac5a49). + [Part 2: Show option for custom field sum only for currency and number custom fields](https://github.com/wekan/wekan/commit/9bee6ae6663a5e1c974de2811f6a5fdd2d66efe5). + Thanks to xet7. +- [Admin Panel/Settings/Layout: Customize OIDC button text](https://github.com/wekan/wekan/pull/4011). + Thanks to Emile840. +- [At card attachments, show play and fullscreen controls for video webm/mp4/ogg, and play controls for audio mp3/ogg](https://github.com/wekan/wekan/commit/bd9fbedbf9fbe0181913876b930b335261cd2a0a). + Thanks to luistiktok and xet7. + +and fixes the following bugs: + +- [Links to devel branch are broken; use master instead](https://github.com/wekan/wekan/pull/3993). + Thanks to garrison. +- [Fix first user creation for via OIDC](https://github.com/wekan/wekan/pull/3994). + Thanks to ww-daniel-mora. +- [When list has just one card, to show 'card' instead of 'cards'](https://github.com/wekan/wekan/pull/3999). + Thanks to helioguardabaxo. +- [Fix: Linked card cannot change date](https://github.com/wekan/wekan/pull/4002). + Thanks to Ben0it-T. +- [Try to fix: Can't delete attachment](https://github.com/wekan/wekan/commit/889ec1339a025a68ec919f059b9d58e8d94a3376). + Thanks to luistiktok and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.58 2021-09-01 Wekan release + +This release fixes the following bugs: + +- [1) Edit profile and modify password menus are not displayed if SSO authentication is used. + 2) Board filtering will be displayed only if user belongs to atleast one team or + organization](https://github.com/wekan/wekan/pull/3983). + Thanks to Emile840. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.57 2021-08-31 Wekan release + +This release adds the following updates: + +- [Updated build scripts](https://github.com/wekan/wekan/commit/52fafe997659e933e403acb0ee0cffc99f74e35f). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.56 2021-08-31 Wekan release + +This release adds the following updates: + +- [Updated dependencies](https://github.com/wekan/wekan/commit/858967f4200783cadaa62d0e3436f661c772ede7). + Thanks to developers of dependencies. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.55 2021-08-31 Wekan release + +This release adds to following CRITICAL SECURITY UPDATES: + +- [Updated to Node.js v12.22.6](https://github.com/wekan/wekan/commit/48636892489dd01c6f6b930bafb94651c00859d8). + Thanks to Node.js developers. + +and fixes the following bugs: + +- [Fixed bugs](https://github.com/wekan/wekan/pull/3981): + 1) Public Boards page shows only "Add Board" button, not any Public Boards. + 2) When at Admin Panel / Boards visibility / Private only, public board still accessible publicly by it's + public board URL. + Thanks to Emile840. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.54 2021-08-28 Wekan release + +This release adds the following new features: + +- [Admin panel: Added a parameter to display or not the visibility of a board in private mode only](https://github.com/wekan/wekan/pull/3976). + Thanks to Emile840. + +and fixes the following bugs: + +- [Fix: Incorrect card numbers for sub tasks](https://github.com/wekan/wekan/pull/3977). + Thanks to syndimann. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.53 2021-08-27 Wekan release + +This release fixes the following bugs: + +- [Try to fix MAIL_FROM](https://github.com/wekan/wekan/commit/787df044190915c46e22159f3c40fb611846dc07). + Thanks to xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.52 2021-08-26 Wekan release + +This release adds the following new features: + +- Added MAIL_SERVICE settings for Well Known Email Services + [Part 1](https://github.com/wekan/wekan/commit/ab8e56e16a02ef0afb7b4023a43b4adf2558a8ff), + [Part 2](https://github.com/wekan/wekan/commit/1fadf204c2d5fa96ea41b9cb39f003cc05e2fe46). + https://github.com/wekan/wekan/wiki/Troubleshooting-Mail . Please test. + Thanks to xet7. +- [All Boards page: Possibility of filtering board by team or organization](https://github.com/wekan/wekan/pull/3964). + Thanks to Emile840. +- [Fixed translation of "Clear Filter" for "All boards page: Possibility of filtering board by team or organization"](https://github.com/wekan/wekan/commit/b36a7621e0feca5c22fc4a24eceba1a9fc584ab0). + Thanks to xet7. + +and adds the following new translations: + +- [Added Chinese (Simplified) (zh-Hans or zh-CN)](https://github.com/wekan/wekan/commit/f2c242f49e18e2197f1f90c9b2dac5934a08325d). + Thanks to translators. + +and fixes the following bugs: + +- [Initials not required for new user that is created at Admin Panel](https://github.com/wekan/wekan/commit/9c7c481f48cb66406715f7571439f9d7fa332b87). + Thanks to xet7. +- [Delete user is now possible at Admin Panel](https://github.com/wekan/wekan/commit/7808fdd22f04cc482b7df21187aaf3e9623f19e6). + But you should remove user first from all boards, because otherwise there could be + bug of empty avatars at boards, that need to be removed manually from database. + Thanks to xet7. +- [Fixed Save button not clickable in maximized card view](https://github.com/wekan/wekan/commit/a59932af00c066871102970d252b78d262d06fa0). + Thanks to hatl, urmel1960 and syndimann. +- [Fixed New wide card edit view is all jumbled on mobile](https://github.com/wekan/wekan/commit/241eb9df0fb446b3775704848281b0cc032c4921). + Thanks to jdaviescoates and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.51 2021-08-17 Wekan release + +This release fixes the following bugs: + +- [Fixed exception in global search](https://github.com/wekan/wekan/pull/3949). + Thanks to syndimann. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.50 2021-08-15 Wekan release + +This release fixes the following bugs: + +- [Fix: Save user initials and fullname when a new user is created](https://github.com/wekan/wekan/pull/3946). + Thanks to syndimann. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.49 2021-08-14 Wekan release + +This release adds the following new features: + +- [Text "Search" now translatable at Card Add Member/Assignee](https://github.com/wekan/wekan/commit/9ce65c601a875a4259fb69fdda45124b8412ae6f). + Thanks to xet7. +- [Add Card Comment Reactions](https://github.com/wekan/wekan/pull/3945). + Thanks to syndimann. + +Thanks to above GitHub users for their contributions and translators for their translations. + +# v5.48 2021-08-11 Wekan release + +This release adds the following CRITICAL SECURITY UPDATES: + +- [Updated to Node.js v12.22.5](https://github.com/wekan/wekan/commit/91cad7b49e25cecdf417321dadcdd9ea5cd8b020). + Thanks to Node.js developers. +- Also jszip update in some of included update commits. + +and adds the following new features: + +- [Searchfields for members and assignees card popups](https://github.com/wekan/wekan/pull/3942). + Thanks to syndimann. + +and adds the following updates: + +- [Updated dependencies](https://github.com/wekan/wekan/commit/b3cc01b04167bd67dde02c6c899baf8917ae09c1). + Thanks to developers of dependencies. + +and adds the following new translations: + +- [French (Switzerland) (fr_CH)](https://github.com/wekan/wekan/commit/23c70ac252494b464cd2a268d7e680370775ddc4). + Thanks to translators. + +and fixes the following bugs: + +- [Fixed: Can't save user without Initials](https://github.com/wekan/wekan/commit/9a03654062f9c8ac7aac257f11b386a054cd39e7). + Thanks to devagleo and xet7. + +Thanks to above GitHub users for their contributions and translators for their translations. # v5.47 2021-08-05 Wekan release @@ -5578,7 +6288,7 @@ This release adds the following new features: and fixes the following bugs: - Revert [Sandstorm API changes](https://github.com/wekan/wekan/commit/be03a191c4321c2f80116c0ee1ae6c826d882535) - that were done at [Wekan v2.05](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v205-2019-01-27-wekan-release) + that were done at [Wekan v2.05](https://github.com/wekan/wekan/blob/master/CHANGELOG.md#v205-2019-01-27-wekan-release) to fix #2143. Thanks to pantraining and xet7. Thanks to above GitHub users and translators for contributions. @@ -5725,7 +6435,7 @@ Update translations. Thanks to translators. This release adds the following new features: - [IFTTT Rules improvements](https://github.com/wekan/wekan/pull/2088). Thanks to Angtrim. -- Add [find.sh](https://github.com/wekan/wekan/blob/devel/find.sh) bash script that ignores +- Add [find.sh](https://github.com/wekan/wekan/blob/master/find.sh) bash script that ignores extra directories when searching. xet7 uses this a lot when developing. Thanks to xet7. Thanks to above GitHub users for their contributions. @@ -7236,7 +7946,7 @@ This release adds the following new features: - [Checklist templates](https://github.com/wekan/wekan/pull/1470); - Added [Finnish language changelog](https://github.com/wekan/wekan/tree/devel/meta/t9n-changelog) - and [more Finnish traslations](https://github.com/wekan/wekan/blob/devel/sandstorm-pkgdef.capnp) + and [more Finnish traslations](https://github.com/wekan/wekan/blob/master/sandstorm-pkgdef.capnp) to Sandstorm. Thanks to GitHub users erikturk and xet7 for their contributions. diff --git a/Dockerfile b/Dockerfile index 0d92f087e..cb4dc9d72 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ -FROM quay.io/wekan/ubuntu:groovy-20210115 +FROM quay.io/wekan/ubuntu:impish-20211102 LABEL maintainer="wekan" -# 2020-12-03: -# - Above Ubuntu base image copied from Docker Hub ubuntu:groovy-20201125.2 +# 2021-09-18: +# - Above Ubuntu base image copied from Docker Hub ubuntu:hirsute-20210825 # to Quay to avoid Docker Hub rate limits. # Set the environment variables (defaults where required) @@ -12,7 +12,7 @@ ARG DEBIAN_FRONTEND=noninteractive ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \ DEBUG=false \ - NODE_VERSION=v12.22.4 \ + NODE_VERSION=v12.22.8 \ METEOR_RELEASE=1.10.2 \ USE_EDGE=false \ METEOR_EDGE=1.5-beta.17 \ @@ -28,6 +28,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 \ ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \ ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \ + ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \ RICHER_CARD_COMMENT_EDITOR=false \ CARD_OPENED_WEBHOOK_ENABLED=false \ ATTACHMENTS_STORE_PATH="" \ @@ -309,6 +310,7 @@ RUN \ apt-get remove --purge -y ${BUILD_DEPS} && \ apt-get autoremove -y && \ npm uninstall -g api2html &&\ + rm -R /tmp/* && \ rm -R /var/lib/apt/lists/* && \ rm -R /home/wekan/.meteor && \ rm -R /home/wekan/app && \ diff --git a/Dockerfile.arm64v8 b/Dockerfile.arm64v8 index 8ca6c9cb4..a9b1a4d37 100644 --- a/Dockerfile.arm64v8 +++ b/Dockerfile.arm64v8 @@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder ENV QEMU_VERSION=v4.2.0-6 \ QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v12.22.4 \ + NODE_VERSION=v12.22.8 \ WEKAN_VERSION=latest \ WEKAN_ARCHITECTURE=arm64 @@ -40,7 +40,7 @@ LABEL maintainer="wekan" # Set the environment variables (defaults where required) ENV QEMU_ARCHITECTURE=aarch64 \ NODE_ARCHITECTURE=linux-arm64 \ - NODE_VERSION=v12.22.4 \ + NODE_VERSION=v12.22.8 \ NODE_ENV=production \ NPM_VERSION=latest \ WITH_API=true \ diff --git a/README.md b/README.md index de4007d16..b3553439c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![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 +# WeKan ® - Open Source kanban [![Contributors](https://img.shields.io/github/contributors/wekan/wekan.svg "Contributors")](https://github.com/wekan/wekan/graphs/contributors) [![Docker Repository on Quay](https://quay.io/repository/wekan/wekan/status "Docker Repository on Quay")](https://quay.io/repository/wekan/wekan) @@ -14,19 +14,19 @@ [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwekan%2Fwekan.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fwekan%2Fwekan?ref=badge_shield) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4619/badge)](https://bestpractices.coreinfrastructure.org/projects/4619) -## [Translate Wekan at Transifex](https://transifex.com/wekan/wekan) +## [Translate WeKan ® at Transifex](https://transifex.com/wekan/wekan) Translations to non-English languages are accepted only at [Transifex](https://transifex.com/wekan/wekan) using webbrowser. New English strings of new features can be added as PRs to edge branch file wekan/i18n/en.i18n.json . ## [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues) -Please add most of your questions as GitHub issue: [Wekan Feature Requests and Bugs](https://github.com/wekan/wekan/issues). +Please add most of your questions as GitHub issue: [WeKan ® Feature Requests and Bugs](https://github.com/wekan/wekan/issues). It's better than at chat where details get lost when chat scrolls up. ## Chat -[Discussions][discussions] - Wekan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues). +[Discussions][discussions] - WeKan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues). [Wekan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ) @@ -41,9 +41,9 @@ See https://github.com/wekan/wekan/issues/3874 - 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 :) -## About Wekan +## About WeKan ® -Wekan is an completely [Open Source][open_source] and [Free software][free_software] +WeKan ® is an completely [Open Source][open_source] and [Free software][free_software] collaborative kanban board application with MIT license. Whether you’re maintaining a personal todo list, planning your holidays with some friends, @@ -51,58 +51,58 @@ or working in a team on your next revolutionary idea, Kanban boards are an unbea to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. -Since Wekan is a free software, you don’t have to trust us with your data and can +Since WeKan ® is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installation on various platforms. -- Wekan is used in [most countries of the world](https://snapcraft.io/wekan). +- 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 63 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. +- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 70 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. ## Requirements - 64bit: Linux [Snap](https://github.com/wekan/wekan-snap/wiki/Install) or [Sandstorm](https://sandstorm.io) / [Mac](https://github.com/wekan/wekan/wiki/Mac) / [Windows](https://github.com/wekan/wekan/wiki/Install-Wekan-from-source-on-Windows). [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. +- 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. - 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. - Wekan on Sandstorm is not usually affected by any Standalone Wekan (Snap/Docker/Source) security issues. +- 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. + WeKan ® on Sandstorm is not usually affected by any Standalone WeKan ® (Snap/Docker/Source) security issues. - [Reporting all new bugs immediately](https://github.com/wekan/wekan/issues). - New features and fixes are added to Wekan [many times a day](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md). -- [Backups](https://github.com/wekan/wekan/wiki/Backup) of Wekan database once a day miminum. + New features and fixes are added to WeKan ® [many times a day](https://github.com/wekan/wekan/blob/master/CHANGELOG.md). +- [Backups](https://github.com/wekan/wekan/wiki/Backup) of WeKan ® database once a day miminum. Bugs, updates, users deleting list or card, harddrive full, harddrive crash etc can eat your data. There is no undo yet. - Some bug can cause Wekan board to not load at all, requiring manual fixing of database content. + Some bug can cause WeKan ® board to not load at all, requiring manual fixing of database content. ## Roadmap and Demo -[Roadmap][roadmap_wekan] - Public read-only board at Wekan demo. +[Roadmap][roadmap_wekan] - Public read-only board at WeKan ® demo. [Developer Documentation][dev_docs] -- There is many companies and individuals contributing code to Wekan, to add features and bugfixes - [many times a day](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md). +- There is many companies and individuals contributing code to WeKan ®, to add features and bugfixes + [many times a day](https://github.com/wekan/wekan/blob/master/CHANGELOG.md). - [Please add Add new Feature Requests and Bug Reports immediately](https://github.com/wekan/wekan/issues). - [Commercial Support](https://wekan.team/commercial-support/). We also welcome sponsors for features and bugfixes. -By working directly with Wekan you get the benefit of active maintenance and new features added by growing Wekan developer community. +By working directly with WeKan ® you get the benefit of active maintenance and new features added by growing WeKan ® developer community. ## Screenshot [More screenshots at Features page](https://github.com/wekan/wekan/wiki/Features) -[![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan] +[![Screenshot of WeKan ®][screenshot_wekan]][roadmap_wekan] ## License -Wekan is released under the very permissive [MIT license](LICENSE), and made +WeKan ® is released under the very permissive [MIT license](LICENSE), and made with [Meteor](https://www.meteor.com). [platforms]: https://github.com/wekan/wekan/wiki/Platforms diff --git a/SECURITY.md b/SECURITY.md index b0ee6c4a3..757142095 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -51,8 +51,8 @@ This also means all Standalone Wekan functionality works in offline local networ Wekan is used by companies that have [thousands of users](https://github.com/wekan/wekan/wiki/AWS) and at healthcare. Wekan uses xss package for input fields like cards, as you can see from -[package.json](https://github.com/wekan/wekan/blob/devel/package.json). Other used versions can be seen from -[Meteor versions file](https://github.com/wekan/wekan/blob/devel/.meteor/versions). +[package.json](https://github.com/wekan/wekan/blob/master/package.json). Other used versions can be seen from +[Meteor versions file](https://github.com/wekan/wekan/blob/master/.meteor/versions). Forms can include markdown links, html, image tags etc like you see at https://wekan.github.io . It's possible to add attachments to cards, and markdown/html links to files. @@ -69,7 +69,7 @@ access to outside of Wekan grain. Standalone Wekan only has password auth currently, there is work in progress to add [oauth2](https://github.com/wekan/wekan/pull/1578), [Openid](https://github.com/wekan/wekan/issues/538), [LDAP](https://github.com/wekan/wekan/issues/119) etc. If you need more login security for Standalone Wekan now, -it's possible add additional [Google Auth proxybouncer](https://github.com/wekan/wekan/wiki/Let's-Encrypt-and-Google-Auth) in front of password auth, and then use Google Authenticator for Google Auth. Standalone Wekan does have [brute force protection with eluck:accounts-lockout and browser-policy clickjacking protection](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v080-2018-04-04-wekan-release). You can also optionally use some [WAF](https://en.wikipedia.org/wiki/Web_application_firewall) +it's possible add additional [Google Auth proxybouncer](https://github.com/wekan/wekan/wiki/Let's-Encrypt-and-Google-Auth) in front of password auth, and then use Google Authenticator for Google Auth. Standalone Wekan does have [brute force protection with eluck:accounts-lockout and browser-policy clickjacking protection](https://github.com/wekan/wekan/blob/master/CHANGELOG.md#v080-2018-04-04-wekan-release). You can also optionally use some [WAF](https://en.wikipedia.org/wiki/Web_application_firewall) like for example [AWS WAF](https://aws.amazon.com/waf/). [All Wekan Platforms](https://github.com/wekan/wekan/wiki/Platforms) @@ -106,7 +106,7 @@ a security issue, we'd like to know about it, and also how to fix it: Typical already known or "no impact" bugs such as: - Brute force password guessign. Currently there is - [brute force protection with eluck:accounts-lockout](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v080-2018-04-04-wekan-release). + [brute force protection with eluck:accounts-lockout](https://github.com/wekan/wekan/blob/master/CHANGELOG.md#v080-2018-04-04-wekan-release). - Security issues related to that Wekan uses Meteor 1.6.0.1 related packages, and upgrading to newer Meteor 1.6.1 is complicated process that requires lots of changes to many dependency packages. Upgrading [has been tried many times, spending a lot of time](https://github.com/meteor/meteor/issues/9609) diff --git a/Stackerfile.yml b/Stackerfile.yml index 11e5589b1..47bbea0c1 100644 --- a/Stackerfile.yml +++ b/Stackerfile.yml @@ -1,5 +1,5 @@ appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928 -appVersion: "v5.47.0" +appVersion: "v5.85.0" files: userUploads: - README.md diff --git a/api.py b/api.py index 891f62aac..ec2d7d3fa 100755 --- a/api.py +++ b/api.py @@ -5,6 +5,9 @@ # Wekan API Python CLI, originally from here, where is more details: # https://github.com/wekan/wekan/wiki/New-card-with-Python3-and-REST-API +# TODO: +# addcustomfieldtoboard: There is error: Settings must be object. So adding does not work yet. + try: # python 3 from urllib.parse import urlencode @@ -23,12 +26,16 @@ if arguments == 0: print("AUTHORID is USERID that writes card.") print("If *nix: chmod +x api.py => ./api.py users") print("Syntax:") - print(" python3 api.py users # All users") - print(" python3 api.py boards USERID # Boards of USERID") - print(" python3 api.py board BOARDID # Info of BOARDID") - print(" python3 api.py swimlanes BOARDID # Swimlanes of BOARDID") - print(" python3 api.py lists BOARDID # Lists of BOARDID") - print(" python3 api.py list BOARDID LISTID # Info of LISTID") + print(" python3 api.py users # All users") + print(" python3 api.py boards # All Public Boards") + print(" python3 api.py boards USERID # Boards of USERID") + print(" python3 api.py board BOARDID # Info of BOARDID") + print(" python3 api.py customfields BOARDID # Custom Fields of BOARDID") + print(" python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID") + print(" python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board") + print(" python3 api.py swimlanes BOARDID # Swimlanes of BOARDID") + print(" python3 api.py lists BOARDID # Lists of BOARDID") + print(" python3 api.py list BOARDID LISTID # Info of LISTID") print(" python3 api.py createlist BOARDID LISTTITLE # Create list") print(" python3 api.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION") print(" python3 api.py editcard BOARDID LISTID CARDID NEWCARDTITLE NEWCARDDESCRIPTION") @@ -65,12 +72,15 @@ chmod +x api.py === Wekan API Python CLI: Shows IDs for addcard === AUTHORID is USERID that writes card. Syntax: - python3 api.py users # All users - python3 api.py boards USERID # Boards of USERID - python3 api.py board BOARDID # Info of BOARDID - python3 api.py swimlanes BOARDID # Swimlanes of BOARDID - python3 api.py lists BOARDID # Lists of BOARDID - python3 api.py list BOARDID LISTID # Info of LISTID + python3 api.py users # All users + python3 api.py boards USERID # Boards of USERID + python3 api.py board BOARDID # Info of BOARDID + python3 api.py customfields BOARDID # Custom Fields of BOARDID + python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID + python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board + python3 api.py swimlanes BOARDID # Swimlanes of BOARDID + python3 api.py lists BOARDID # Lists of BOARDID + python3 api.py list BOARDID LISTID # Info of LISTID python3 api.py createlist BOARDID LISTTITLE # Create list python3 api.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION python3 api.py editcard BOARDID LISTID CARDID NEWCARDTITLE NEWCARDDESCRIPTION @@ -78,6 +88,13 @@ Syntax: python3 api.py attachmentjson BOARDID ATTACHMENTID # One attachment as JSON base64 python3 api.py attachmentbinary BOARDID ATTACHMENTID # One attachment as binary file +=== ADD CUSTOM FIELD TO BOARD === + +Type: text, number, date, dropdown, checkbox, currency, stringtemplate. + +python3 api.py addcustomfieldtoboard cmx3gmHLKwAXLqjxz LcDW4QdooAx8hsZh8 "SomeField" "date" "" true true true true + + === USERS === python3 api.py users @@ -133,6 +150,7 @@ l = 'lists' sw = 'swimlane' sws = 'swimlanes' cs = 'cards' +cf = 'custom-fields' bs = 'boards' atl = 'attachmentslist' at = 'attachment' @@ -150,10 +168,34 @@ apikey = d['token'] # ------- LOGIN TOKEN END ----------- +if arguments == 10: + + if sys.argv[1] == 'addcustomfieldtoboard': + # ------- ADD CUSTOM FIELD TO BOARD START ----------- + authorid = sys.argv[2] + boardid = sys.argv[3] + name = sys.argv[4] + type1 = sys.argv[5] + settings = str(json.loads(sys.argv[6])) + # There is error: Settings must be object. So this does not work yet. + #settings = {'currencyCode': 'EUR'} + print(type(settings)) + showoncard = sys.argv[7] + automaticallyoncard = sys.argv[8] + showlabelonminicard = sys.argv[9] + showsumattopoflist = sys.argv[10] + customfieldtoboard = wekanurl + apiboards + boardid + s + cf + # Add Custom Field to Board + headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} + post_data = {'authorId': '{}'.format(authorid), 'name': '{}'.format(name), 'type': '{}'.format(type1), 'settings': '{}'.format(settings), 'showoncard': '{}'.format(showoncard), 'automaticallyoncard': '{}'.format(automaticallyoncard), 'showlabelonminicard': '{}'.format(showlabelonminicard), 'showsumattopoflist': '{}'.format(showsumattopoflist)} + body = requests.post(customfieldtoboard, data=post_data, headers=headers) + print(body.text) + # ------- ADD CUSTOM FIELD TO BOARD END ----------- + if arguments == 7: if sys.argv[1] == 'addcard': - # ------- WRITE TO CARD START ----------- + # ------- ADD CARD START ----------- authorid = sys.argv[2] boardid = sys.argv[3] swimlaneid = sys.argv[4] @@ -161,18 +203,18 @@ if arguments == 7: cardtitle = sys.argv[6] carddescription = sys.argv[7] cardtolist = wekanurl + apiboards + boardid + s + l + s + listid + s + cs - # Write to card + # Add card headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} post_data = {'authorId': '{}'.format(authorid), 'title': '{}'.format(cardtitle), 'description': '{}'.format(carddescription), 'swimlaneId': '{}'.format(swimlaneid)} body = requests.post(cardtolist, data=post_data, headers=headers) print(body.text) - # ------- WRITE TO CARD END ----------- + # ------- ADD CARD END ----------- if arguments == 6: if sys.argv[1] == 'editcard': - # ------- LIST OF BOARD START ----------- + # ------- EDIT CARD START ----------- boardid = sys.argv[2] listid = sys.argv[3] cardid = sys.argv[4] @@ -187,7 +229,7 @@ if arguments == 6: body = requests.get(edcard, headers=headers) data2 = body.text.replace('}',"}\n") print(data2) - # ------- LISTS OF BOARD END ----------- + # ------- EDIT CARD END ----------- if arguments == 3: @@ -217,6 +259,19 @@ if arguments == 3: print(data2) # ------- LISTS OF BOARD END ----------- + if sys.argv[1] == 'customfield': + + # ------- INFO OF CUSTOM FIELD START ----------- + boardid = sys.argv[2] + customfieldid = sys.argv[3] + customfieldone = wekanurl + apiboards + boardid + s + cf + s + customfieldid + headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} + print("=== INFO OF ONE CUSTOM FIELD ===\n") + body = requests.get(customfieldone, headers=headers) + data2 = body.text.replace('}',"}\n") + print(data2) + # ------- INFO OF CUSTOM FIELD END ----------- + if arguments == 2: # ------- BOARDS LIST START ----------- @@ -230,8 +285,8 @@ if arguments == 2: data2 = body.text.replace('}',"}\n") print(data2) # ------- BOARDS LIST END ----------- - if sys.argv[1] == 'board': + if sys.argv[1] == 'board': # ------- BOARD INFO START ----------- boardid = sys.argv[2] board = wekanurl + apiboards + boardid @@ -242,6 +297,17 @@ if arguments == 2: print(data2) # ------- BOARD INFO END ----------- + if sys.argv[1] == 'customfields': + # ------- CUSTOM FIELDS OF BOARD START ----------- + boardid = sys.argv[2] + boardcustomfields = wekanurl + apiboards + boardid + s + cf + headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} + body = requests.get(boardcustomfields, headers=headers) + print("=== CUSTOM FIELDS OF BOARD ===\n") + data2 = body.text.replace('}',"}\n") + print(data2) + # ------- CUSTOM FIELDS OF BOARD END ----------- + if sys.argv[1] == 'swimlanes': boardid = sys.argv[2] swimlanes = wekanurl + apiboards + boardid + s + sws @@ -289,3 +355,14 @@ if arguments == 1: data2 = body.text.replace('}',"}\n") print(data2) # ------- LIST OF USERS END ----------- + + if sys.argv[1] == 'boards': + + # ------- LIST OF PUBLIC BOARDS START ----------- + headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)} + print("=== PUBLIC BOARDS ===\n") + listpublicboards = wekanurl + apiboards + body = requests.get(listpublicboards, headers=headers) + data2 = body.text.replace('}',"}\n") + print(data2) + # ------- LIST OF PUBLIC BOARDS END ----------- diff --git a/client/components/activities/activities.jade b/client/components/activities/activities.jade index 38825ab5d..d6e6bfbad 100644 --- a/client/components/activities/activities.jade +++ b/client/components/activities/activities.jade @@ -12,7 +12,7 @@ template(name="boardActivities") +activity(activity=activityData card=card mode=mode) template(name="cardActivities") - each activityData in currentCard.activities + each activityData in activities +activity(activity=activityData card=card mode=mode) template(name="editOrDeleteComment") @@ -21,6 +21,26 @@ template(name="editOrDeleteComment") = ' - ' a.js-delete-comment {{_ "delete"}} +template(name="deleteCommentPopup") + p {{_ "comment-delete"}} + button.js-confirm.negate.full(type="submit") {{_ 'delete'}} + +template(name="commentReactions") + .reactions + each reaction in reactions + span.reaction(class="{{#if isSelected reaction.userIds}}selected{{/if}}" data-codepoint="#{reaction.reactionCodepoint}" title="{{userNames reaction.userIds}}") + span.reaction-codepoint !{reaction.reactionCodepoint} + span.reaction-count #{reaction.userIds.length} + if (currentUser.isBoardMember) + a.open-comment-reaction-popup(title="{{_ 'addReactionPopup-title'}}") + i.fa.fa-smile-o + i.fa.fa-plus + +template(name="addReactionPopup") + .reactions-popup + each codepoint in codepoints + span.add-comment-reaction(data-codepoint="#{codepoint}") !{codepoint} + template(name="activity") .activity +userAvatar(userId=activity.user._id) @@ -120,10 +140,12 @@ template(name="activity") = activity.comment.text .edit-controls button.primary(type="submit") {{_ 'edit'}} + .fa.fa-times-thin.js-close-inlined-form else .activity-comment +viewer = activity.comment.text + +commentReactions(reactions=activity.comment.reactions commentId=activity.comment._id) span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }} if($eq currentUser._id activity.comment.userId) +editOrDeleteComment @@ -150,20 +172,20 @@ template(name="activity") if($eq activity.activityType 'a-startAt') | {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}. - + if($eq activity.activityType 'a-dueAt') | {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}. if($eq activity.activityType 'a-endAt') | {{{_ 'activity-endDate' (sanitize endDate) cardLink}}}. - + if($eq mode 'board') if($eq activity.activityType 'a-receivedAt') | {{{_ 'activity-receivedDate' (sanitize receivedDate) cardLink}}}. if($eq activity.activityType 'a-startAt') | {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}. - + if($eq activity.activityType 'a-dueAt') | {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}. diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index fa2628600..cc5237097 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -13,14 +13,14 @@ BlazeComponent.extendComponent({ this.autorun(() => { let mode = this.data().mode; const capitalizedMode = Utils.capitalize(mode); - let thisId, searchId; + let searchId; if (mode === 'linkedcard' || mode === 'linkedboard') { - thisId = Session.get('currentCard'); - searchId = Cards.findOne({ _id: thisId }).linkedId; + searchId = Utils.getCurrentCard().linkedId; mode = mode.replace('linked', ''); + } else if (mode === 'card') { + searchId = Utils.getCurrentCardId(); } else { - thisId = Session.get(`current${capitalizedMode}`); - searchId = thisId; + searchId = Session.get(`current${capitalizedMode}`); } const limit = this.page.get() * activitiesPerPage; const user = Meteor.user(); @@ -54,6 +54,13 @@ BlazeComponent.extendComponent({ }, }).register('activities'); +Template.activities.helpers({ + activities() { + const ret = this.card.activities(); + return ret; + }, +}); + BlazeComponent.extendComponent({ checkItem() { const checkItemId = this.currentData().activity.checklistItemId; @@ -113,8 +120,10 @@ BlazeComponent.extendComponent({ ).getLabelById(lastLabelId); if (lastLabel && (lastLabel.name === undefined || lastLabel.name === '')) { return lastLabel.color; - } else { + } else if (lastLabel.name !== undefined && lastLabel.name !== '') { return lastLabel.name; + } else { + return null; } }, @@ -211,10 +220,11 @@ BlazeComponent.extendComponent({ return [ { // XXX We should use Popup.afterConfirmation here - 'click .js-delete-comment'() { - const commentId = this.currentData().activity.commentId; + 'click .js-delete-comment': Popup.afterConfirm('deleteComment', () => { + const commentId = this.data().activity.commentId; CardComments.remove(commentId); - }, + Popup.back(); + }), 'submit .js-edit-comment'(evt) { evt.preventDefault(); const commentText = this.currentComponent() @@ -240,6 +250,60 @@ Template.activity.helpers({ }, }); +Template.commentReactions.events({ + 'click .reaction'(event) { + if (Meteor.user().isBoardMember()) { + const codepoint = event.currentTarget.dataset['codepoint']; + const commentId = Template.instance().data.commentId; + const cardComment = CardComments.findOne({_id: commentId}); + cardComment.toggleReaction(codepoint); + } + }, + 'click .open-comment-reaction-popup': Popup.open('addReaction'), +}) + +Template.addReactionPopup.events({ + 'click .add-comment-reaction'(event) { + if (Meteor.user().isBoardMember()) { + const codepoint = event.currentTarget.dataset['codepoint']; + const commentId = Template.instance().data.commentId; + const cardComment = CardComments.findOne({_id: commentId}); + cardComment.toggleReaction(codepoint); + } + Popup.back(); + }, +}) + +Template.addReactionPopup.helpers({ + codepoints() { + // Starting set of unicode codepoints as comment reactions + return [ + '👍', + '👎', + '👀', + '✅', + '❌', + '🙏', + '👏', + '🎉', + '🚀', + '😊', + '🤔', + '😔']; + } +}) + +Template.commentReactions.helpers({ + isSelected(userIds) { + return userIds.includes(Meteor.user()._id); + }, + userNames(userIds) { + return Users.find({_id: {$in: userIds}}) + .map(user => user.profile.fullname) + .join(', '); + } +}) + function createCardLink(card) { if (!card) return ''; return ( diff --git a/client/components/activities/activities.styl b/client/components/activities/activities.styl index 3df2b7816..48b5f8024 100644 --- a/client/components/activities/activities.styl +++ b/client/components/activities/activities.styl @@ -5,6 +5,20 @@ display: flex justify-content:space-between +.reactions-popup + .add-comment-reaction + display: inline-block + cursor: pointer + border-radius: 5px + font-size: 22px + text-align: center + line-height: 30px + width: 40px + + &:hover { + background-color: #b0c4de + } + .activities clear: both @@ -18,7 +32,7 @@ height: @width .activity-member - font-weight: 700 + font-weight: 700 .activity-desc word-wrap: break-word @@ -39,6 +53,45 @@ margin-top: 5px padding: 5px + .reactions + display: flex + margin-top: 5px + gap: 5px + + .open-comment-reaction-popup + display: flex + align-items: center + text-decoration: none + height: 24px; + + i.fa.fa-smile-o + font-size: 17px + font-weight: 500 + margin-left: 2px + + i.fa.fa-plus + font-size: 8px; + margin-top: -7px; + margin-left: 1px; + + .reaction + cursor: pointer + border: 1px solid grey + border-radius: 15px + display: flex + padding: 2px 5px + + &.selected { + background-color: #b0c4de + } + + &:hover { + background-color: #b0c4de + } + + .reaction-count + font-size: 12px + .activity-checklist display: block border-radius: 3px diff --git a/client/components/activities/comments.js b/client/components/activities/comments.js index c69ec383e..b9165ce95 100644 --- a/client/components/activities/comments.js +++ b/client/components/activities/comments.js @@ -64,7 +64,7 @@ function resetCommentInput(input) { // Tracker.autorun to register the component dependencies, and re-run when these // dependencies are invalidated. A better component API would remove this hack. Tracker.autorun(() => { - Session.get('currentCard'); + Utils.getCurrentCardId(); Tracker.afterFlush(() => { autosize.update($('.js-new-comment-input')); }); @@ -75,7 +75,7 @@ EscapeActions.register( () => { const draftKey = { fieldName: 'cardComment', - docId: Session.get('currentCard'), + docId: Utils.getCurrentCardId(), }; const commentInput = $('.js-new-comment-input'); const draft = commentInput.val().trim(); diff --git a/client/components/activities/comments.styl b/client/components/activities/comments.styl index ccf24b726..d7492b767 100644 --- a/client/components/activities/comments.styl +++ b/client/components/activities/comments.styl @@ -31,7 +31,6 @@ background-color: #fff border: 0 box-shadow: 0 1px 2px rgba(0, 0, 0, .23) - color: #8c8c8c height: 36px margin: 4px 4px 6px 0 padding: 9px 11px diff --git a/client/components/boards/boardArchive.js b/client/components/boards/boardArchive.js index 49f024f8d..ca80a694b 100644 --- a/client/components/boards/boardArchive.js +++ b/client/components/boards/boardArchive.js @@ -34,7 +34,7 @@ BlazeComponent.extendComponent({ Utils.goBoardId(board._id); }, 'click .js-delete-board': Popup.afterConfirm('boardDelete', function() { - Popup.close(); + Popup.back(); const isSandstorm = Meteor.settings && Meteor.settings.public && diff --git a/client/components/boards/boardBody.jade b/client/components/boards/boardBody.jade index c11d0bd22..edeb25464 100644 --- a/client/components/boards/boardBody.jade +++ b/client/components/boards/boardBody.jade @@ -13,26 +13,29 @@ template(name="board") +spinner template(name="boardBody") - .board-wrapper(class=currentBoard.colorClass) - +sidebar - .board-canvas.js-swimlanes( - class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}" - class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}" - class="{{#if draggingActive.get}}is-dragging-active{{/if}}") - if showOverlay.get - .board-overlay - if currentBoard.isTemplatesBoard - each currentBoard.swimlanes - +swimlane(this) - else if isViewSwimlanes - each currentBoard.swimlanes - +swimlane(this) - else if isViewLists - +listsGroup(currentBoard) - else if isViewCalendar - +calendarView - else - +listsGroup(currentBoard) + if notDisplayThisBoard + | {{_ 'tableVisibilityMode-allowPrivateOnly'}} + else + .board-wrapper(class=currentBoard.colorClass) + +sidebar + .board-canvas.js-swimlanes( + class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}" + class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}" + class="{{#if draggingActive.get}}is-dragging-active{{/if}}") + if showOverlay.get + .board-overlay + if currentBoard.isTemplatesBoard + each currentBoard.swimlanes + +swimlane(this) + else if isViewSwimlanes + each currentBoard.swimlanes + +swimlane(this) + else if isViewLists + +listsGroup(currentBoard) + else if isViewCalendar + +calendarView + else + +listsGroup(currentBoard) template(name="calendarView") if isViewCalendar diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index 900931d05..81846f2ee 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -23,7 +23,7 @@ BlazeComponent.extendComponent({ }, onlyShowCurrentCard() { - return Utils.isMiniScreen() && Session.get('currentCard'); + return Utils.isMiniScreen() && Utils.getCurrentCardId(true); }, goHome() { @@ -33,6 +33,7 @@ BlazeComponent.extendComponent({ BlazeComponent.extendComponent({ onCreated() { + Meteor.subscribe('tableVisibilityModeSettings'); this.showOverlay = new ReactiveVar(false); this.draggingActive = new ReactiveVar(false); this._isDragging = false; @@ -190,21 +191,11 @@ BlazeComponent.extendComponent({ }); this.autorun(() => { - let showDesktopDragHandles = false; - currentUser = Meteor.user(); - if (currentUser) { - showDesktopDragHandles = (currentUser.profile || {}) - .showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - showDesktopDragHandles = true; - } else { - showDesktopDragHandles = false; - } - if (Utils.isMiniScreen() || showDesktopDragHandles) { + if (Utils.isMiniScreenOrShowDesktopDragHandles()) { $swimlanesDom.sortable({ handle: '.js-swimlane-header-handle', }); - } else if (!Utils.isMiniScreen() && !showDesktopDragHandles) { + } else { $swimlanesDom.sortable({ handle: '.swimlane-header', }); @@ -215,7 +206,7 @@ BlazeComponent.extendComponent({ $swimlanesDom.sortable( 'option', 'disabled', - !Meteor.user().isBoardAdmin(), + !Meteor.user() || !Meteor.user().isBoardAdmin(), ); }); @@ -235,6 +226,16 @@ BlazeComponent.extendComponent({ } }, + notDisplayThisBoard(){ + let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly'); + let currentBoard = Boards.findOne(Session.get('currentBoard')); + if(allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue && currentBoard.permission == 'public'){ + return true; + } + + return false; + }, + isViewSwimlanes() { currentUser = Meteor.user(); if (currentUser) { @@ -325,6 +326,7 @@ BlazeComponent.extendComponent({ defaultView: 'agendaDay', editable: true, timezone: 'local', + weekNumbers: true, header: { left: 'title today prev,next', center: diff --git a/client/components/boards/boardColors.styl b/client/components/boards/boardColors.styl index 19246356b..2cf5dfcbb 100644 --- a/client/components/boards/boardColors.styl +++ b/client/components/boards/boardColors.styl @@ -876,7 +876,7 @@ setBoardClear(color1,color2) padding: 10px top: 0 - .list-header .list-header-plus-icon + .list-header .list-header-plus-top color: #a6a6a6 .list-body @@ -956,17 +956,24 @@ setBoardClear(color1,color2) /* Card Details */ .card-details - position: absolute - top: 30px - left: calc(50% - 384px) - width: 768px - max-height: calc(100% - 60px) background-color: #454545 color: #cccccc box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) border: 1px solid #111111 z-index: 100 !important + @media screen and (max-width: 800px) + .card-details + width: 98% + + @media screen and (min-width: 801px) + .card-details + position: absolute + top: 30px + left: calc(50% - 384px) + width: 768px + max-height: calc(100% - 60px) + .card-details scrollbar-width: thin scrollbar-color: #343434 #999999 diff --git a/client/components/boards/boardHeader.jade b/client/components/boards/boardHeader.jade index 019f3deba..8a749efd2 100644 --- a/client/components/boards/boardHeader.jade +++ b/client/components/boards/boardHeader.jade @@ -80,6 +80,12 @@ template(name="boardHeaderBar") if $eq watchLevel "muted" i.fa.fa-bell-slash span {{_ watchLevel}} + a.board-header-btn(title="{{_ 'sort-cards'}}" class="{{#if isSortActive }}emphasis{{else}} js-sort-cards {{/if}}") + i.fa.fa-sort + span {{#if isSortActive }}{{_ 'Sort is on'}}{{else}}{{_ 'sort-cards'}}{{/if}} + if isSortActive + a.board-header-btn-close.js-sort-reset(title="Remove Sort") + i.fa.fa-times-thin else a.board-header-btn.js-log-in( @@ -147,14 +153,15 @@ template(name="boardVisibilityList") if visibilityCheck i.fa.fa-check span.sub-name {{_ 'private-desc'}} - li - with "public" - a.js-select-visibility - i.fa.fa-globe.colorful - | {{_ 'public'}} - if visibilityCheck - i.fa.fa-check - span.sub-name {{_ 'public-desc'}} + if notAllowPrivateVisibilityOnly + li + with "public" + a.js-select-visibility + i.fa.fa-globe.colorful + | {{_ 'public'}} + if visibilityCheck + i.fa.fa-check + span.sub-name {{_ 'public-desc'}} template(name="boardChangeVisibilityPopup") +boardVisibilityList diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index 05415222f..ed7d9490e 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -7,11 +7,11 @@ Template.boardMenuPopup.events({ 'click .js-rename-board': Popup.open('boardChangeTitle'), 'click .js-custom-fields'() { Sidebar.setView('customFields'); - Popup.close(); + Popup.back(); }, 'click .js-open-archives'() { Sidebar.setView('archives'); - Popup.close(); + Popup.back(); }, 'click .js-change-board-color': Popup.open('boardChangeColor'), 'click .js-change-language': Popup.open('changeLanguage'), @@ -24,7 +24,7 @@ Template.boardMenuPopup.events({ }), 'click .js-delete-board': Popup.afterConfirm('deleteBoard', function() { const currentBoard = Boards.findOne(Session.get('currentBoard')); - Popup.close(); + Popup.back(); Boards.remove(currentBoard._id); FlowRouter.go('home'); }), @@ -47,7 +47,7 @@ Template.boardChangeTitlePopup.events({ if (newTitle) { this.rename(newTitle); this.setDescription(newDesc); - Popup.close(); + Popup.back(); } event.preventDefault(); }, @@ -136,7 +136,7 @@ BlazeComponent.extendComponent({ Sidebar.setView('search'); }, 'click .js-multiselection-activate'() { - const currentCard = Session.get('currentCard'); + const currentCard = Utils.getCurrentCardId(); MultiSelection.activate(); if (currentCard) { MultiSelection.add(currentCard); @@ -173,15 +173,15 @@ Template.boardHeaderBar.helpers({ Template.boardChangeViewPopup.events({ 'click .js-open-lists-view'() { Utils.setBoardView('board-view-lists'); - Popup.close(); + Popup.back(); }, 'click .js-open-swimlanes-view'() { Utils.setBoardView('board-view-swimlanes'); - Popup.close(); + Popup.back(); }, 'click .js-open-cal-view'() { Utils.setBoardView('board-view-cal'); - Popup.close(); + Popup.back(); }, }); @@ -194,6 +194,11 @@ const CreateBoard = BlazeComponent.extendComponent({ this.visibilityMenuIsOpen = new ReactiveVar(false); this.visibility = new ReactiveVar('private'); this.boardId = new ReactiveVar(''); + Meteor.subscribe('tableVisibilityModeSettings'); + }, + + notAllowPrivateVisibilityOnly(){ + return !TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').booleanValue; }, visibilityCheck() { @@ -310,6 +315,9 @@ const CreateBoard = BlazeComponent.extendComponent({ }.register('headerBarCreateBoardPopup')); BlazeComponent.extendComponent({ + notAllowPrivateVisibilityOnly(){ + return !TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').booleanValue; + }, visibilityCheck() { const currentBoard = Boards.findOne(Session.get('currentBoard')); return this.currentData() === currentBoard.permission; @@ -319,7 +327,7 @@ BlazeComponent.extendComponent({ const currentBoard = Boards.findOne(Session.get('currentBoard')); const visibility = this.currentData(); currentBoard.setVisibility(visibility); - Popup.close(); + Popup.back(); }, events() { @@ -352,7 +360,7 @@ BlazeComponent.extendComponent({ Session.get('currentBoard'), level, (err, ret) => { - if (!err && ret) Popup.close(); + if (!err && ret) Popup.back(); }, ); }, @@ -424,7 +432,7 @@ BlazeComponent.extendComponent({ const direction = down ? -1 : 1; this.setSortBy([sortby, direction]); if (Utils.isMiniScreen) { - Popup.close(); + Popup.back(); } }, }, @@ -443,7 +451,7 @@ BlazeComponent.extendComponent({ }; Session.set('sortBy', sortBy); sortCardsBy.set(TAPi18n.__('due-date')); - Popup.close(); + Popup.back(); }, 'click .js-sort-title'() { const sortBy = { @@ -451,7 +459,7 @@ BlazeComponent.extendComponent({ }; Session.set('sortBy', sortBy); sortCardsBy.set(TAPi18n.__('title')); - Popup.close(); + Popup.back(); }, 'click .js-sort-created-asc'() { const sortBy = { @@ -459,7 +467,7 @@ BlazeComponent.extendComponent({ }; Session.set('sortBy', sortBy); sortCardsBy.set(TAPi18n.__('date-created-newest-first')); - Popup.close(); + Popup.back(); }, 'click .js-sort-created-desc'() { const sortBy = { @@ -467,7 +475,7 @@ BlazeComponent.extendComponent({ }; Session.set('sortBy', sortBy); sortCardsBy.set(TAPi18n.__('date-created-oldest-first')); - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/boards/boardsList.jade b/client/components/boards/boardsList.jade index dae1221dc..33dcfe087 100644 --- a/client/components/boards/boardsList.jade +++ b/client/components/boards/boardsList.jade @@ -1,11 +1,32 @@ template(name="boardList") .wrapper + ul.AllBoardTeamsOrgs + li.AllBoardTeams + if userHasTeams + select.js-AllBoardTeams#jsAllBoardTeams("multiple") + option(value="-1") {{_ 'teams'}} : + each teamsDatas + option(value="{{teamId}}") {{_ teamDisplayName}} + + li.AllBoardOrgs + if userHasOrgs + select.js-AllBoardOrgs#jsAllBoardOrgs("multiple") + option(value="-1") {{_ 'organizations'}} : + each orgsDatas + option(value="{{orgId}}") {{_ orgDisplayName}} + li.AllBoardBtns + div.AllBoardButtonsContainer + if userHasOrgsOrTeams + i.fa.fa-filter + input#filterBtn(type="button" value="{{_ 'filter'}}") + input#resetBtn(type="button" value="{{_ 'filter-clear'}}") + ul.board-list.clearfix.js-boards li.js-add-board a.board-list-item.label(title="{{_ 'add-board'}}") | {{_ 'add-board'}} each boards - li(class="{{#if isStarred}}starred{{/if}}" class=colorClass).js-board + li(class="{{_id}}" class="{{#if isStarred}}starred{{/if}}" class=colorClass).js-board if isInvited .board-list-item span.details @@ -33,11 +54,11 @@ template(name="boardList") i.fa.js-has-spenttime-cards( class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}" title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}") - if isMiniScreen + if isMiniScreenOrShowDesktopDragHandles i.fa.board-handle( class="fa-arrows" title="{{_ 'Drag board'}}") - unless isMiniScreen + else if isSandstorm i.fa.js-clone-board( class="fa-clone" @@ -75,11 +96,11 @@ template(name="boardList") i.fa.js-has-spenttime-cards( class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}" title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}") - if isMiniScreen + if isMiniScreenOrShowDesktopDragHandles i.fa.board-handle( class="fa-arrows" title="{{_ 'Drag board'}}") - unless isMiniScreen + else if isSandstorm i.fa.js-clone-board( class="fa-clone" diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index fba4820ed..cdc2430ca 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -1,5 +1,4 @@ const subManager = new SubsManager(); -const { calculateIndex, enableClickOnTouch } = Utils; Template.boardListHeaderBar.events({ 'click .js-open-archived-board'() { @@ -22,6 +21,7 @@ Template.boardListHeaderBar.helpers({ BlazeComponent.extendComponent({ onCreated() { Meteor.subscribe('setting'); + Meteor.subscribe('tableVisibilityModeSettings'); let currUser = Meteor.user(); let userLanguage; if(currUser && currUser.profile){ @@ -55,7 +55,7 @@ BlazeComponent.extendComponent({ // of the previous and the following card -- if any. const prevBoardDom = ui.item.prev('.js-board').get(0); const nextBoardBom = ui.item.next('.js-board').get(0); - const sortIndex = calculateIndex(prevBoardDom, nextBoardBom, 1); + const sortIndex = Utils.calculateIndex(prevBoardDom, nextBoardBom, 1); const boardDomElement = ui.item.get(0); const board = Blaze.getData(boardDomElement); @@ -72,21 +72,56 @@ BlazeComponent.extendComponent({ }, }); - // ugly touch event hotfix - enableClickOnTouch(itemsSelector); - // Disable drag-dropping if the current user is not a board member or is comment only this.autorun(() => { - if (Utils.isMiniScreen()) { + if (Utils.isMiniScreenOrShowDesktopDragHandles()) { $boards.sortable({ handle: '.board-handle', }); } }); }, + userHasTeams(){ + if(Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0) + return true; + else + return false; + }, + teamsDatas() { + if(Meteor.user().teams) + return Meteor.user().teams.sort((a, b) => a.teamDisplayName.localeCompare(b.teamDisplayName)); + else + return []; + }, + userHasOrgs(){ + if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0) + return true; + else + return false; + }, + orgsDatas() { + if(Meteor.user().orgs) + return Meteor.user().orgs.sort((a, b) => a.orgDisplayName.localeCompare(b.orgDisplayName)); + else + return []; + }, + userHasOrgsOrTeams(){ + let boolUserHasOrgs; + if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0) + boolUserHasOrgs = true; + else + boolUserHasOrgs = false; + let boolUserHasTeams; + if(Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0) + boolUserHasTeams = true; + else + boolUserHasTeams = false; + + return (boolUserHasOrgs || boolUserHasTeams); + }, boards() { - const query = { + let query = { //archived: false, ////type: { $in: ['board','template-container'] }, //type: 'board', @@ -96,9 +131,15 @@ BlazeComponent.extendComponent({ { $or:[] } ] }; + + let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly'); + if (FlowRouter.getRouteName() === 'home'){ query.$and[2].$or.push({'members.userId': Meteor.userId()}); + if(allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue){ + query.$and.push({'permission': 'private'}); + } const currUser = Users.findOne(Meteor.userId()); // const currUser = Users.findOne(Meteor.userId(), { @@ -108,7 +149,7 @@ BlazeComponent.extendComponent({ // }, // }); - let orgIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : ''; + let orgIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : ''; if(orgIdsUserBelongs && orgIdsUserBelongs != ''){ let orgsIds = orgIdsUserBelongs.split(','); // for(let i = 0; i < orgsIds.length; i++){ @@ -119,7 +160,7 @@ BlazeComponent.extendComponent({ query.$and[2].$or.push({'orgs.orgId': {$in : orgsIds}}); } - let teamIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : ''; + let teamIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : ''; if(teamIdsUserBelongs && teamIdsUserBelongs != ''){ let teamsIds = teamIdsUserBelongs.split(','); // for(let i = 0; i < teamsIds.length; i++){ @@ -129,10 +170,17 @@ BlazeComponent.extendComponent({ query.$and[2].$or.push({'teams.teamId': {$in : teamsIds}}); } } - else query.permission = 'public'; + else if(allowPrivateVisibilityOnly !== undefined && !allowPrivateVisibilityOnly.booleanValue){ + query = { + archived: false, + //type: { $in: ['board','template-container'] }, + type: 'board', + permission: 'public', + }; + } return Boards.find(query, { - //sort: { sort: 1 /* boards default sorting */ }, + sort: { sort: 1 /* boards default sorting */ }, }); }, isStarred() { @@ -206,6 +254,74 @@ BlazeComponent.extendComponent({ } }); }, + 'click #resetBtn'(event){ + let allBoards = document.getElementsByClassName("js-board"); + let currBoard; + for(let i=0; i < allBoards.length; i++){ + currBoard = allBoards[i]; + currBoard.style.display = "block"; + } + }, + 'click #filterBtn'(event) { + event.preventDefault(); + let selectedTeams = document.querySelectorAll('#jsAllBoardTeams option:checked'); + let selectedTeamsValues = Array.from(selectedTeams).map(function(elt){return elt.value}); + let index = selectedTeamsValues.indexOf("-1"); + if (index > -1) { + selectedTeamsValues.splice(index, 1); + } + + let selectedOrgs = document.querySelectorAll('#jsAllBoardOrgs option:checked'); + let selectedOrgsValues = Array.from(selectedOrgs).map(function(elt){return elt.value}); + index = selectedOrgsValues.indexOf("-1"); + if (index > -1) { + selectedOrgsValues.splice(index, 1); + } + + if(selectedTeamsValues.length > 0 || selectedOrgsValues.length > 0){ + const query = { + $and: [ + { archived: false }, + { type: 'board' }, + { $or:[] } + ] + }; + if(selectedTeamsValues.length > 0) + { + query.$and[2].$or.push({'teams.teamId': {$in : selectedTeamsValues}}); + } + if(selectedOrgsValues.length > 0) + { + query.$and[2].$or.push({'orgs.orgId': {$in : selectedOrgsValues}}); + } + + let filteredBoards = Boards.find(query, {}).fetch(); + let allBoards = document.getElementsByClassName("js-board"); + let currBoard; + if(filteredBoards.length > 0){ + let currBoardId; + let found; + for(let i=0; i < allBoards.length; i++){ + currBoard = allBoards[i]; + currBoardId = currBoard.classList[0]; + found = filteredBoards.find(function(board){ + return board._id == currBoardId; + }); + + if(found !== undefined) + currBoard.style.display = "block"; + else + currBoard.style.display = "none"; + } + } + else{ + for(let i=0; i < allBoards.length; i++){ + currBoard = allBoards[i]; + currBoard.style.display = "none"; + } + } + } + }, }, ]; }, diff --git a/client/components/boards/boardsList.styl b/client/components/boards/boardsList.styl index 635138f3d..70f2e3e90 100644 --- a/client/components/boards/boardsList.styl +++ b/client/components/boards/boardsList.styl @@ -229,3 +229,25 @@ $spaceBetweenTiles = 16px transform: translateY(-50%) right: 10px font-size: 24px + +.AllBoardTeamsOrgs + list-style-type: none; + overflow: hidden; + +.AllBoardTeams,.AllBoardOrgs,.AllBoardBtns + float: left; + +.js-AllBoardOrgs + margin-left: 16px; + +.AllBoardTeams + margin-left : 16px; + +.AllBoardButtonsContainer + margin: 16px; + +#filterBtn,#resetBtn + display: inline; + +.js-board + display: block; diff --git a/client/components/cards/attachments.jade b/client/components/cards/attachments.jade index ee714aefa..88276c76f 100644 --- a/client/components/cards/attachments.jade +++ b/client/components/cards/attachments.jade @@ -26,12 +26,25 @@ template(name="attachmentsGalery") if isUploaded if isImage img.attachment-thumbnail-img(src="{{url}}") + else if($eq extension 'mp3') + video(width="100%" height="100%" controls="true") + source(src="{{url}}" type="audio/mpeg") + else if($eq extension 'ogg') + video(width="100%" height="100%" controls="true") + source(src="{{url}}" type="video/ogg") + else if($eq extension 'webm') + video(width="100%" height="100%" controls="true") + source(src="{{url}}" type="video/webm") + else if($eq extension 'mp4') + video(width="100%" height="100%" controls="true") + source(src="{{url}}" type="video/mp4") else span.attachment-thumbnail-ext= extension else +spinner p.attachment-details = name + span.file-size ({{fileSize size}} KB) span.attachment-details-actions a.js-download(href="{{url download=true}}") i.fa.fa-download diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index bd668a8e9..89ce1ee71 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -4,7 +4,7 @@ Template.attachmentsGalery.events({ 'attachmentDelete', function() { Attachments.remove(this._id); - Popup.close(); + Popup.back(); }, ), // If we let this event bubble, FlowRouter will handle it and empty the page @@ -49,11 +49,14 @@ Template.attachmentsGalery.helpers({ isBoardAdmin() { return Meteor.user().isBoardAdmin(); }, + fileSize(size) { + return Math.round(size / 1024); + }, }); Template.previewAttachedImagePopup.events({ 'click .js-large-image-clicked'() { - Popup.close(); + Popup.back(); }, }); @@ -65,7 +68,7 @@ Template.cardAttachmentsPopup.events({ if (attachment && attachment._id && attachment.isImage()) { card.setCover(attachment._id); } - Popup.close(); + Popup.back(); }); }; @@ -174,7 +177,7 @@ Template.previewClipboardImagePopup.events({ pastedResults = null; $(document.body).pasteImageReader(() => {}); - Popup.close(); + Popup.back(); } }, }); diff --git a/client/components/cards/attachments.styl b/client/components/cards/attachments.styl index 4a22fd8a3..e437aaa36 100644 --- a/client/components/cards/attachments.styl +++ b/client/components/cards/attachments.styl @@ -9,7 +9,7 @@ margin: 10px 1% 0 text-align: center border-radius: 3px - overflow: hidden + overflow: auto background: darken(white, 7%) min-height: 120px diff --git a/client/components/cards/cardCustomFields.jade b/client/components/cards/cardCustomFields.jade index 8acf9f5e9..e8f69ab1b 100644 --- a/client/components/cards/cardCustomFields.jade +++ b/client/components/cards/cardCustomFields.jade @@ -63,7 +63,7 @@ template(name="cardCustomField-checkbox") template(name="cardCustomField-currency") if canModifyCard +inlinedForm(classNames="js-card-customfield-currency") - input(type="text" value=data.value) + input(type="text" value=data.value autofocus) .edit-controls.clearfix button.primary(type="submit") {{_ 'save'}} a.fa.fa-times-thin.js-close-inlined-form @@ -79,18 +79,22 @@ template(name="cardCustomField-currency") template(name="cardCustomField-date") if canModifyCard - a.js-edit-date(title="{{showTitle}}" class="{{classes}}") - if value - div.card-date - time(datetime="{{showISODate}}") - | {{showDate}} - else - | {{_ 'edit'}} - else + a.js-edit-date(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}") if value - div.card-date - time(datetime="{{showISODate}}") - | {{showDate}} + div.card-date + time(datetime="{{showISODate}}") + | {{showDate}} + b + | {{showWeek}} + else + | {{_ 'edit'}} + else + if value + div.card-date + time(datetime="{{showISODate}}") + | {{showDate}} + b + | {{showWeek}} template(name="cardCustomField-dropdown") if canModifyCard diff --git a/client/components/cards/cardCustomFields.js b/client/components/cards/cardCustomFields.js index fee41c00b..b9844438a 100644 --- a/client/components/cards/cardCustomFields.js +++ b/client/components/cards/cardCustomFields.js @@ -3,7 +3,7 @@ import Cards from '/models/cards'; Template.cardCustomFieldsPopup.helpers({ hasCustomField() { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const customFieldId = this._id; return card.customFieldIndex(customFieldId) > -1; }, @@ -11,7 +11,7 @@ Template.cardCustomFieldsPopup.helpers({ Template.cardCustomFieldsPopup.events({ 'click .js-select-field'(event) { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const customFieldId = this._id; card.toggleCustomField(customFieldId); event.preventDefault(); @@ -31,7 +31,7 @@ const CardCustomField = BlazeComponent.extendComponent({ onCreated() { const self = this; - self.card = Cards.findOne(Session.get('currentCard')); + self.card = Utils.getCurrentCard(); self.customFieldId = this.data()._id; }, @@ -149,6 +149,10 @@ CardCustomField.register('cardCustomField'); }); } + showWeek() { + return this.date.get().week().toString(); + } + showDate() { // this will start working once mquandalle:moment // is updated to at least moment.js 2.10.5 @@ -190,7 +194,7 @@ CardCustomField.register('cardCustomField'); onCreated() { super.onCreated(); const self = this; - self.card = Cards.findOne(Session.get('currentCard')); + self.card = Utils.getCurrentCard(); self.customFieldId = this.data()._id; this.data().value && this.date.set(moment(this.data().value)); } @@ -267,7 +271,7 @@ CardCustomField.register('cardCustomField'); { 'submit .js-card-customfield-stringtemplate'(event) { event.preventDefault(); - const items = this.getItems(); + const items = this.stringtemplateItems.get(); this.card.setCustomField(this.customFieldId, items); }, diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade index 9bcc67f2f..caaab219c 100644 --- a/client/components/cards/cardDate.jade +++ b/client/components/cards/cardDate.jade @@ -1,14 +1,20 @@ template(name="dateBadge") if canModifyCard - a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}") + a.js-edit-date.card-date(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}") time(datetime="{{showISODate}}") | {{showDate}} + b + | {{showWeek}} else - a.card-date(title="{{showTitle}}" class="{{classes}}") + a.card-date(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}") time(datetime="{{showISODate}}") | {{showDate}} + b + | {{showWeek}} template(name="dateCustomField") - a(title="{{showTitle}}" class="{{classes}}") + a(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}") time(datetime="{{showISODate}}") | {{showDate}} + b + | {{showWeek}} diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 6bd46d5a5..685f79e3a 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -24,7 +24,7 @@ Template.dateBadge.helpers({ } _deleteDate() { - this.card.setReceived(null); + this.card.unsetReceived(); } }.register('editCardReceivedDatePopup')); @@ -50,7 +50,7 @@ Template.dateBadge.helpers({ } _deleteDate() { - this.card.setStart(null); + this.card.unsetStart(); } }.register('editCardStartDatePopup')); @@ -73,7 +73,7 @@ Template.dateBadge.helpers({ } _deleteDate() { - this.card.setDue(null); + this.card.unsetDue(); } }.register('editCardDueDatePopup')); @@ -96,7 +96,7 @@ Template.dateBadge.helpers({ } _deleteDate() { - this.card.setEnd(null); + this.card.unsetEnd(); } }.register('editCardEndDatePopup')); @@ -115,6 +115,10 @@ const CardDate = BlazeComponent.extendComponent({ }, 60000); }, + showWeek() { + return this.date.get().week().toString(); + }, + showDate() { // this will start working once mquandalle:moment // is updated to at least moment.js 2.10.5 @@ -284,12 +288,25 @@ class CardCustomFieldDate extends CardDate { }); } - classes() { - return 'customfield-date'; + showWeek() { + return this.date.get().week().toString(); + } + + showDate() { + // this will start working once mquandalle:moment + // is updated to at least moment.js 2.10.5 + // until then, the date is displayed in the "L" format + return this.date.get().calendar(null, { + sameElse: 'llll', + }); } showTitle() { - return ''; + return `${this.date.get().format('LLLL')}`; + } + + classes() { + return 'customfield-date'; } events() { diff --git a/client/components/cards/cardDescription.js b/client/components/cards/cardDescription.js index d83735861..c958c335e 100644 --- a/client/components/cards/cardDescription.js +++ b/client/components/cards/cardDescription.js @@ -25,7 +25,10 @@ BlazeComponent.extendComponent({ // Pressing Ctrl+Enter should submit the form 'keydown form textarea'(evt) { if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) { - this.find('button[type=submit]').click(); + const submitButton = this.find('button[type=submit]'); + if (submitButton) { + submitButton.click(); + } } }, }, diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index d818057dc..cf049625c 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -1,27 +1,40 @@ +template(name="cardDetailsPopup") + +cardDetails(popupCard) + template(name="cardDetails") - section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}'): .card-details-canvas + section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas .card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}') +inlinedForm(classNames="js-card-details-title") +editCardTitleForm else unless isMiniScreen - a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") - unless cardMaximized - a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}") - if cardMaximized - a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}") + unless isPopup + a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") + if cardMaximized + a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}") + else + a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}") if currentUser.isBoardMember a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") - input.inline-input(type="text" id="cardURL_copy" value="{{ originRelativeUrl }}") a.fa.fa-link.card-copy-button.js-copy-link( + id="cardURL_copy" class="fa-link" title="{{_ 'copy-card-link-to-clipboard'}}" + href="{{ originRelativeUrl }}" ) - if isMiniScreen - a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details(title="{{_ 'close-card'}}") + span.copied-tooltip {{_ 'copied'}} + else + unless isPopup + a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}") if currentUser.isBoardMember a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}") - a.fa.fa-link.card-copy-mobile-button + a.fa.fa-link.card-copy-mobile-button.js-copy-link( + id="cardURL_copy" + class="fa-link" + title="{{_ 'copy-card-link-to-clipboard'}}" + href="{{ originRelativeUrl }}" + ) + span.copied-tooltip {{_ 'copied'}} h2.card-details-title.js-card-title( class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}") +viewer @@ -66,8 +79,10 @@ template(name="cardDetails") a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") i.fa.fa-plus - if currentBoard.allowsReceivedDate + if currentBoard.hasAnyAllowsDate hr + + if currentBoard.allowsReceivedDate .card-details-item.card-details-item-received h3.card-details-item-title i.fa.fa-sign-out @@ -119,7 +134,9 @@ template(name="cardDetails") a.card-label.add-label.js-end-date i.fa.fa-plus - hr + if currentBoard.hasAnyAllowsUser + hr + if currentBoard.allowsCreator .card-details-item.card-details-item-creator h3.card-details-item-title @@ -160,17 +177,6 @@ template(name="cardDetails") a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}") i.fa.fa-plus - //.card-details-items - if getSpentTime - .card-details-item.card-details-item-spent - if getIsOvertime - h3.card-details-item-title - | {{_ 'overtime-hours'}} - else - h3.card-details-item-title - | {{_ 'spent-time-hours'}} - +cardSpentTime - //.card-details-items if currentBoard.allowsRequestedBy .card-details-item.card-details-item-name @@ -212,6 +218,9 @@ template(name="cardDetails") +viewer = getAssignedBy + if $or currentBoard.allowsCardSortingByNumber getSpentTime + hr + if currentBoard.allowsCardSortingByNumber .card-details-item.card-details-sort-order h3.card-details-item-title @@ -225,15 +234,36 @@ template(name="cardDetails") +viewer = sort + //.card-details-items + if getSpentTime + .card-details-item.card-details-item-spent + if getIsOvertime + h3.card-details-item-title + | {{_ 'overtime-hours'}} + else + h3.card-details-item-title + | {{_ 'spent-time-hours'}} + +cardSpentTime + //.card-details-items if customFieldsWD - hr + unless customFieldsGrid + hr each customFieldsWD + if customFieldsGrid + hr .card-details-item.card-details-item-customfield h3.card-details-item-title i.fa.fa-list-alt = definition.name +cardCustomField + .material-toggle-switch(title="{{_ 'change'}} {{_ 'custom-fields'}} {{_ 'layout'}}") + if customFieldsGrid + input.toggle-switch(type="checkbox" id="toggleCustomFieldsGridButton" checked="checked") + else + input.toggle-switch(type="checkbox" id="toggleCustomFieldsGridButton") + label.toggle-label(for="toggleCustomFieldsGridButton") + a.fa.fa-plus.js-custom-fields.card-details-item.custom-fields(title="{{_ 'custom-fields'}}") if getVoteQuestion hr @@ -519,6 +549,7 @@ template(name="cardDetails") .card-details-right unless currentUser.isNoComments + hr .activity-title h3.card-details-item-title i.fa.fa-history @@ -708,8 +739,9 @@ template(name="boardsAndLists") button.primary.confirm.js-done {{_ 'done'}} template(name="cardMembersPopup") + input.card-members-filter(type="text" placeholder="{{_ 'search'}}") ul.pop-over-list.js-card-member-list - each board.activeMembers + each members li.item(class="{{#if isCardMember}}active{{/if}}") a.name.js-select-member(href="#") +userAvatar(userId=user._id) @@ -720,9 +752,10 @@ template(name="cardMembersPopup") i.fa.fa-check template(name="cardAssigneesPopup") + input.card-assignees-filter(type="text" placeholder="{{_ 'search'}}") unless currentUser.isWorker ul.pop-over-list.js-card-assignee-list - each board.activeMembers + each members li.item(class="{{#if isCardAssignee}}active{{/if}}") a.name.js-select-assignee(href="#") +userAvatar(userId=user._id) @@ -767,6 +800,7 @@ template(name="cardMorePopup") i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}") input.inline-input(type="text" id="cardURL" readonly value="{{ originRelativeUrl }}" autofocus="autofocus") button.js-copy-card-link-to-clipboard(class="btn" id="clipboard") {{_ 'copy-card-link-to-clipboard'}} + .copied-tooltip {{_ 'copied'}} span.clearfix br h2 {{_ 'change-card-parent'}} @@ -815,6 +849,12 @@ template(name="cardDeletePopup") p {{_ "card-delete-suggest-archive"}} button.js-confirm.negate.full(type="submit") {{_ 'delete'}} +template(name="cardArchivePopup") + p {{_ "card-archive-pop"}} + unless archived + p {{_ "card-archive-suggest-cancel"}} + button.js-confirm.negate.full(type="submit") {{_ 'archive'}} + template(name="deleteVotePopup") p {{_ "vote-delete-pop"}} button.js-confirm.negate.full(type="submit") {{_ 'delete'}} diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index b0e1dba42..3c3d7df33 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -34,15 +34,25 @@ BlazeComponent.extendComponent({ onCreated() { this.currentBoard = Boards.findOne(Session.get('currentBoard')); this.isLoaded = new ReactiveVar(false); - const boardBody = this.parentComponent().parentComponent(); - //in Miniview parent is Board, not BoardBody. - if (boardBody !== null) { - boardBody.showOverlay.set(true); - boardBody.mouseHasEnterCardDetails = false; + + if (this.parentComponent() && this.parentComponent().parentComponent()) { + const boardBody = this.parentComponent().parentComponent(); + //in Miniview parent is Board, not BoardBody. + if (boardBody !== null) { + boardBody.showOverlay.set(true); + boardBody.mouseHasEnterCardDetails = false; + } } this.calculateNextPeak(); Meteor.subscribe('unsaved-edits'); + + // this.findUsersOptions = new ReactiveVar({}); + // this.page = new ReactiveVar(1); + // this.autorun(() => { + // const limitUsers = this.page.get() * Number.MAX_SAFE_INTEGER; + // this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {}); + // }); }, isWatching() { @@ -54,6 +64,11 @@ BlazeComponent.extendComponent({ return Meteor.user().hasHiddenSystemMessages(); }, + customFieldsGrid() { + return Meteor.user().hasCustomFieldsGrid(); + }, + + cardMaximized() { return Meteor.user().hasCardMaximized(); }, @@ -180,7 +195,7 @@ BlazeComponent.extendComponent({ integration, 'CardSelected', params, - () => {}, + () => { }, ); }); } @@ -203,7 +218,7 @@ BlazeComponent.extendComponent({ distance: 7, start(evt, ui) { ui.placeholder.height(ui.helper.height()); - EscapeActions.executeUpTo('popup-close'); + EscapeActions.clickExecute(evt.target, 'inlinedForm'); }, stop(evt, ui) { let prevChecklist = ui.item.prev('.js-checklist').get(0); @@ -285,6 +300,7 @@ BlazeComponent.extendComponent({ }, onDestroyed() { + if (this.parentComponent() === null) return; const parentComponent = this.parentComponent().parentComponent(); //on mobile view parent is Board, not board body. if (parentComponent === null) return; @@ -307,30 +323,12 @@ BlazeComponent.extendComponent({ 'click .js-close-card-details'() { Utils.goBoardId(this.data().boardId); }, - 'click .js-copy-link'() { - const StringToCopyElement = document.getElementById('cardURL_copy'); - StringToCopyElement.value = - window.location.origin + window.location.pathname; - StringToCopyElement.select(); - if (document.execCommand('copy')) { - StringToCopyElement.blur(); - } else { - document.getElementById('cardURL_copy').selectionStart = 0; - document.getElementById('cardURL_copy').selectionEnd = 999; - document.execCommand('copy'); - if (window.getSelection) { - if (window.getSelection().empty) { - // Chrome - window.getSelection().empty(); - } else if (window.getSelection().removeAllRanges) { - // Firefox - window.getSelection().removeAllRanges(); - } - } else if (document.selection) { - // IE? - document.selection.empty(); - } - } + 'click .js-copy-link'(event) { + event.preventDefault(); + const promise = Utils.copyTextToClipboard(event.target.href); + + const $tooltip = this.$('.card-details-header .copied-tooltip'); + Utils.showCopied(promise, $tooltip); }, 'click .js-open-card-details-menu': Popup.open('cardDetailsActions'), 'submit .js-card-description'(event) { @@ -365,6 +363,12 @@ BlazeComponent.extendComponent({ this.data().setRequestedBy(''); } }, + 'keydown input.js-edit-card-sort'(evt) { + // enter = save + if (evt.keyCode === 13) { + this.find('button[type=submit]').click(); + } + }, 'submit .js-card-details-sort'(event) { event.preventDefault(); const sort = parseFloat(this.currentComponent() @@ -389,7 +393,9 @@ BlazeComponent.extendComponent({ 'click .js-end-date': Popup.open('editCardEndDate'), 'click .js-show-positive-votes': Popup.open('positiveVoteMembers'), 'click .js-show-negative-votes': Popup.open('negativeVoteMembers'), + 'click .js-custom-fields': Popup.open('cardCustomFields'), 'mouseenter .js-card-details'() { + if (this.parentComponent() === null) return; const parentComponent = this.parentComponent().parentComponent(); //on mobile view parent is Board, not BoardBody. if (parentComponent === null) return; @@ -412,6 +418,9 @@ BlazeComponent.extendComponent({ 'click #toggleButton'() { Meteor.call('toggleSystemMessages'); }, + 'click #toggleCustomFieldsGridButton'() { + Meteor.call('toggleCustomFieldsGrid'); + }, 'click .js-maximize-card-details'() { Meteor.call('toggleCardMaximized'); autosize($('.card-details')); @@ -511,6 +520,23 @@ BlazeComponent.extendComponent({ }, }).register('cardDetails'); +Template.cardDetails.helpers({ + isPopup() { + let ret = !!Utils.getPopupCardId(); + return ret; + } +}); +Template.cardDetailsPopup.onDestroyed(() => { + Session.delete('popupCardId'); + Session.delete('popupCardBoardId'); +}); +Template.cardDetailsPopup.helpers({ + popupCard() { + const ret = Utils.getPopupCard(); + return ret; + }, +}); + BlazeComponent.extendComponent({ template() { return 'exportCard'; @@ -541,8 +567,8 @@ BlazeComponent.extendComponent({ }).register('exportCardPopup'); // only allow number input -Template.editCardSortOrderForm.onRendered(function() { - this.$('input').on("keypress paste", function(event) { +Template.editCardSortOrderForm.onRendered(function () { + this.$('input').on("keypress paste", function (event) { let keyCode = event.keyCode; let charCode = String.fromCharCode(keyCode); let regex = new RegExp('[-0-9.]'); @@ -561,16 +587,15 @@ Template.editCardSortOrderForm.onRendered(function() { // XXX Recovering the currentCard identifier form a session variable is // fragile because this variable may change for instance if the route // change. We should use some component props instead. - docId: Session.get('currentCard'), + docId: Utils.getCurrentCardId(), }; } close(isReset = false) { if (this.isOpen.get() && !isReset) { const draft = this.getValue().trim(); - if ( - draft !== Cards.findOne(Session.get('currentCard')).getDescription() - ) { + let card = Utils.getCurrentCard(); + if (card && draft !== card.getDescription()) { UnsavedEdits.set(this._getUnsavedEditKey(), this.getValue()); } } @@ -615,7 +640,6 @@ Template.cardDetailsActionsPopup.events({ 'click .js-export-card': Popup.open('exportCard'), 'click .js-members': Popup.open('cardMembers'), 'click .js-assignees': Popup.open('cardAssignees'), - 'click .js-labels': Popup.open('cardLabels'), 'click .js-attachments': Popup.open('cardAttachments'), 'click .js-start-voting': Popup.open('cardStartVoting'), 'click .js-start-planning-poker': Popup.open('cardStartPlanningPoker'), @@ -634,25 +658,27 @@ Template.cardDetailsActionsPopup.events({ event.preventDefault(); const minOrder = _.min( this.list() - .cards(this.swimlaneId) + .cardsUnfiltered(this.swimlaneId) .map((c) => c.sort), ); this.move(this.boardId, this.swimlaneId, this.listId, minOrder - 1); + Popup.back(); }, 'click .js-move-card-to-bottom'(event) { event.preventDefault(); const maxOrder = _.max( this.list() - .cards(this.swimlaneId) + .cardsUnfiltered(this.swimlaneId) .map((c) => c.sort), ); this.move(this.boardId, this.swimlaneId, this.listId, maxOrder + 1); + Popup.back(); }, - 'click .js-archive'(event) { - event.preventDefault(); - this.archive(); + 'click .js-archive': Popup.afterConfirm('cardArchive', function () { Popup.close(); - }, + this.archive(); + Utils.goBoardId(this.boardId); + }), 'click .js-more': Popup.open('cardMore'), 'click .js-toggle-watch-card'() { const currentCard = this; @@ -667,6 +693,64 @@ Template.editCardTitleForm.onRendered(function () { autosize(this.$('.js-edit-card-title')); }); +Template.cardMembersPopup.onCreated(function () { + let currBoard = Boards.findOne(Session.get('currentBoard')); + let members = currBoard.activeMembers(); + + // let query = { + // "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) }, + // }; + + // let boardTeamUsers = Users.find(query, { + // sort: { sort: 1 }, + // }); + + // members = currBoard.activeMembers2(members, boardTeamUsers); + + this.members = new ReactiveVar(members); +}); + +Template.cardMembersPopup.events({ + 'keyup .card-members-filter'(event) { + const members = filterMembers(event.target.value); + Template.instance().members.set(members); + } +}); + +Template.cardMembersPopup.helpers({ + members() { + return Template.instance().members.get(); + }, +}); + +const filterMembers = (filterTerm) => { + let currBoard = Boards.findOne(Session.get('currentBoard')); + let members = currBoard.activeMembers(); + + // let query = { + // "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) }, + // }; + + // let boardTeamUsers = Users.find(query, { + // sort: { sort: 1 }, + // }); + + // members = currBoard.activeMembers2(members, boardTeamUsers); + + if (filterTerm) { + members = members + .map(member => ({ + member, + user: Users.findOne(member.userId) + })) + .filter(({ user }) => + (user.profile.fullname !== undefined && user.profile.fullname.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1) + || user.profile.fullname === undefined && user.profile.username !== undefined && user.profile.username.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1) + .map(({ member }) => member); + } + return members; +} + Template.editCardTitleForm.events({ 'keydown .js-edit-card-title'(event) { // If enter key was pressed, submit the data @@ -707,7 +791,7 @@ Template.moveCardPopup.events({ 'click .js-done'() { // XXX We should *not* get the currentCard from the global state, but // instead from a “component” state. - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const bSelect = $('.js-select-boards')[0]; let boardId; // if we are a worker, we won't have a board select so we just use the @@ -719,7 +803,13 @@ Template.moveCardPopup.events({ const slSelect = $('.js-select-swimlanes')[0]; const swimlaneId = slSelect.options[slSelect.selectedIndex].value; card.move(boardId, swimlaneId, listId, 0); - Popup.close(); + + // set new id's to card object in case the card is moved to top by the comment "moveCard" after this command (.js-move-card) + this.boardId = boardId; + this.swimlaneId = swimlaneId; + this.listId = listId; + + Popup.back(); }, }); BlazeComponent.extendComponent({ @@ -765,7 +855,7 @@ BlazeComponent.extendComponent({ Template.copyCardPopup.events({ 'click .js-done'() { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const lSelect = $('.js-select-lists')[0]; const listId = lSelect.options[lSelect.selectedIndex].value; const slSelect = $('.js-select-swimlanes')[0]; @@ -787,14 +877,14 @@ Template.copyCardPopup.events({ // See https://github.com/wekan/wekan/issues/80 Filter.addException(_id); - Popup.close(); + Popup.back(); } }, }); Template.convertChecklistItemToCardPopup.events({ 'click .js-done'() { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const lSelect = $('.js-select-lists')[0]; const listId = lSelect.options[lSelect.selectedIndex].value; const slSelect = $('.js-select-swimlanes')[0]; @@ -814,7 +904,7 @@ Template.convertChecklistItemToCardPopup.events({ }); Filter.addException(_id); - Popup.close(); + Popup.back(); } }, @@ -822,7 +912,7 @@ Template.convertChecklistItemToCardPopup.events({ Template.copyChecklistToManyCardsPopup.events({ 'click .js-done'() { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const oldId = card._id; card._id = null; const lSelect = $('.js-select-lists')[0]; @@ -870,7 +960,7 @@ Template.copyChecklistToManyCardsPopup.events({ cmt.copy(_id); }); } - Popup.close(); + Popup.back(); } }, }); @@ -941,7 +1031,7 @@ BlazeComponent.extendComponent({ }, cards() { - const currentId = Session.get('currentCard'); + const currentId = Utils.getCurrentCardId(); if (this.parentBoard.get()) { return Cards.find({ boardId: this.parentBoard.get(), @@ -980,30 +1070,11 @@ BlazeComponent.extendComponent({ events() { return [ { - 'click .js-copy-card-link-to-clipboard'() { - // Clipboard code from: - // https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser - const StringToCopyElement = document.getElementById('cardURL'); - StringToCopyElement.select(); - if (document.execCommand('copy')) { - StringToCopyElement.blur(); - } else { - document.getElementById('cardURL').selectionStart = 0; - document.getElementById('cardURL').selectionEnd = 999; - document.execCommand('copy'); - if (window.getSelection) { - if (window.getSelection().empty) { - // Chrome - window.getSelection().empty(); - } else if (window.getSelection().removeAllRanges) { - // Firefox - window.getSelection().removeAllRanges(); - } - } else if (document.selection) { - // IE? - document.selection.empty(); - } - } + 'click .js-copy-card-link-to-clipboard'(event) { + const promise = Utils.copyTextToClipboard(location.origin + document.getElementById('cardURL').value); + + const $tooltip = this.$('.copied-tooltip'); + Utils.showCopied(promise, $tooltip); }, 'click .js-delete': Popup.afterConfirm('cardDelete', function () { Popup.close(); @@ -1019,9 +1090,8 @@ BlazeComponent.extendComponent({ // https://github.com/wekan/wekan/issues/2785 const message = `${TAPi18n.__( 'delete-linked-card-before-this-card', - )} linkedId: ${ - this._id - } at client/components/cards/cardDetails.js and https://github.com/wekan/wekan/issues/2785`; + )} linkedId: ${this._id + } at client/components/cards/cardDetails.js and https://github.com/wekan/wekan/issues/2785`; alert(message); } Utils.goBoardId(this.boardId); @@ -1074,12 +1144,12 @@ BlazeComponent.extendComponent({ if (endString) { this.currentCard.setVoteEnd(endString); } - Popup.close(); + Popup.back(); }, 'click .js-remove-vote': Popup.afterConfirm('deleteVote', () => { event.preventDefault(); this.currentCard.unsetVote(); - Popup.close(); + Popup.back(); }), 'click a.js-toggle-vote-public'(event) { event.preventDefault(); @@ -1119,7 +1189,7 @@ BlazeComponent.extendComponent({ // if active vote - store it if (this.currentData().getVoteQuestion()) { this._storeDate(newDate.toDate()); - Popup.close(); + Popup.back(); } else { this.currentData().vote = { end: newDate.toDate() }; // set vote end temp Popup.back(); @@ -1153,86 +1223,77 @@ BlazeComponent.extendComponent({ // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(usaDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: usaDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (euroAmDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(euroAmDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: euroAmDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (euro24hDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(euro24hDate.toDate()); this.card.setPokerEnd(euro24hDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: euro24hDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (eurodotDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(eurodotDate.toDate()); this.card.setPokerEnd(eurodotDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: eurodotDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (minusDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(minusDate.toDate()); this.card.setPokerEnd(minusDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: minusDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (slashDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(slashDate.toDate()); this.card.setPokerEnd(slashDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: slashDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (dotDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(dotDate.toDate()); this.card.setPokerEnd(dotDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: dotDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (brezhonegDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(brezhonegDate.toDate()); this.card.setPokerEnd(brezhonegDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: brezhonegDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (hrvatskiDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(hrvatskiDate.toDate()); this.card.setPokerEnd(hrvatskiDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: hrvatskiDate.toDate() }; // set poker end temp Popup.back(); @@ -1242,41 +1303,37 @@ BlazeComponent.extendComponent({ if (this.currentData().getPokerQuestion()) { this._storeDate(latviaDate.toDate()); this.card.setPokerEnd(latviaDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: latviaDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (nederlandsDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(nederlandsDate.toDate()); this.card.setPokerEnd(nederlandsDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: nederlandsDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (greekDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(greekDate.toDate()); this.card.setPokerEnd(greekDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: greekDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (macedonianDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(macedonianDate.toDate()); this.card.setPokerEnd(macedonianDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: macedonianDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else { this.error.set('invalid-date'); evt.target.date.focus(); @@ -1285,7 +1342,7 @@ BlazeComponent.extendComponent({ 'click .js-delete-date'(evt) { evt.preventDefault(); this._deleteDate(); - Popup.close(); + Popup.back(); }, }, ]; @@ -1323,11 +1380,11 @@ BlazeComponent.extendComponent({ if (endString) { this.currentCard.setPokerEnd(endString); } - Popup.close(); + Popup.back(); }, 'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => { this.currentCard.unsetPoker(); - Popup.close(); + Popup.back(); }), 'click a.js-toggle-poker-allow-non-members'(event) { event.preventDefault(); @@ -1390,7 +1447,7 @@ BlazeComponent.extendComponent({ // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(newDate.toDate()); - Popup.close(); + Popup.back(); } else { this.currentData().poker = { end: newDate.toDate() }; // set poker end temp Popup.back(); @@ -1422,130 +1479,117 @@ BlazeComponent.extendComponent({ // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(usaDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: usaDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (euroAmDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(euroAmDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: euroAmDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (euro24hDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(euro24hDate.toDate()); this.card.setPokerEnd(euro24hDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: euro24hDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (eurodotDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(eurodotDate.toDate()); this.card.setPokerEnd(eurodotDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: eurodotDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (minusDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(minusDate.toDate()); this.card.setPokerEnd(minusDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: minusDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (slashDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(slashDate.toDate()); this.card.setPokerEnd(slashDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: slashDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (dotDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(dotDate.toDate()); this.card.setPokerEnd(dotDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: dotDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (brezhonegDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(brezhonegDate.toDate()); this.card.setPokerEnd(brezhonegDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: brezhonegDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (hrvatskiDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(hrvatskiDate.toDate()); this.card.setPokerEnd(hrvatskiDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: hrvatskiDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (latviaDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(latviaDate.toDate()); this.card.setPokerEnd(latviaDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: latviaDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (nederlandsDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(nederlandsDate.toDate()); this.card.setPokerEnd(nederlandsDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: nederlandsDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (greekDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(greekDate.toDate()); this.card.setPokerEnd(greekDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: greekDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else if (macedonianDate.isValid()) { // if active poker - store it if (this.currentData().getPokerQuestion()) { this._storeDate(macedonianDate.toDate()); this.card.setPokerEnd(macedonianDate.toDate()); - Popup.close(); } else { this.currentData().poker = { end: macedonianDate.toDate() }; // set poker end temp - Popup.back(); } + Popup.back(); } else { // this.error.set('invalid-date); this.error.set('invalid-date' + ' ' + dateString); @@ -1555,7 +1599,7 @@ BlazeComponent.extendComponent({ 'click .js-delete-date'(evt) { evt.preventDefault(); this._deleteDate(); - Popup.close(); + Popup.back(); }, }, ]; @@ -1589,13 +1633,34 @@ EscapeActions.register( }, ); +Template.cardAssigneesPopup.onCreated(function () { + let currBoard = Boards.findOne(Session.get('currentBoard')); + let members = currBoard.activeMembers(); + + // let query = { + // "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) }, + // }; + + // let boardTeamUsers = Users.find(query, { + // sort: { sort: 1 }, + // }); + + // members = currBoard.activeMembers2(members, boardTeamUsers); + + this.members = new ReactiveVar(members); +}); + Template.cardAssigneesPopup.events({ 'click .js-select-assignee'(event) { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const assigneeId = this.userId; card.toggleAssignee(assigneeId); event.preventDefault(); }, + 'keyup .card-assignees-filter'(event) { + const members = filterMembers(event.target.value); + Template.instance().members.set(members); + }, }); Template.cardAssigneesPopup.helpers({ @@ -1606,6 +1671,10 @@ Template.cardAssigneesPopup.helpers({ return _.contains(cardAssignees, this.userId); }, + members() { + return Template.instance().members.get(); + }, + user() { return Users.findOne(this.userId); }, @@ -1657,7 +1726,7 @@ Template.cardAssigneePopup.helpers({ Template.cardAssigneePopup.events({ 'click .js-remove-assignee'() { Cards.findOne(this.cardId).unassignAssignee(this.userId); - Popup.close(); + Popup.back(); }, 'click .js-edit-profile': Popup.open('editProfile'), }); diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl index 48aa8d40d..ac007b169 100644 --- a/client/components/cards/cardDetails.styl +++ b/client/components/cards/cardDetails.styl @@ -4,15 +4,6 @@ avatar-radius = 50% -#cardURL_copy - // Have clipboard text not visible by moving it to far left - position: absolute - left: -2000px - top: 0px - -#clipboard - white-space: normal - .assignee border-radius: 3px display: block @@ -85,6 +76,12 @@ avatar-radius = 50% box-shadow: 0 0 0 2px darken(white, 60%) inset // Other card details +.copied-tooltip + display: none + padding: 0px 10px; + background-color: #000000df; + color: #fff; + border-radius: 5px; .card-details padding: 0 @@ -127,7 +124,8 @@ avatar-radius = 50% .card-copy-button, .card-copy-mobile-button, .close-card-details-mobile-web, - .card-details-menu-mobile-web + .card-details-menu-mobile-web, + .copied-tooltip float: right .close-card-details, @@ -196,6 +194,14 @@ avatar-radius = 50% border-radius: 3px padding: 0px 5px + .copied-tooltip + display: none + margin-right: 10px + padding: 10px; + background-color: #000000df; + color: #fff; + border-radius: 5px; + .card-description textarea min-height: 100px @@ -230,55 +236,54 @@ avatar-radius = 50% word-wrap: break-word max-width: 28% flex-grow: 1 + &.custom-fields + padding-left: 10px + .card-details-item-title font-size: 16px font-weight: bold color: #4d4d4d - .card-label - padding-top: 5px - padding-bottom: 5px - .activities padding-top: 10px -.card-details-maximized - padding: 0 - flex-shrink: 0 - flex-basis: calc(100% - 20px) - will-change: flex-basis - overflow-y: scroll - overflow-x: scroll - background: darken(white, 3%) - border-radius: bottom 3px - z-index: 1000 !important - animation: flexGrowIn 0.1s - box-shadow: 0 0 7px 0 darken(white, 30%) - transition: flex-basis 0.1s - box-sizing: border-box - position: absolute - top: 0 - left: 0 - height: calc(100% - 20px) - width: calc(100% - 20px) - float: left - - .card-details-left +@media screen and (min-width: 801px) + .card-details-maximized + padding: 0 + flex-shrink: 0 + flex-basis: calc(100% - 20px) + will-change: flex-basis + overflow-y: scroll + overflow-x: scroll + background: darken(white, 3%) + border-radius: bottom 3px + z-index: 1000 !important + animation: flexGrowIn 0.1s + box-shadow: 0 0 7px 0 darken(white, 30%) + transition: flex-basis 0.1s + box-sizing: border-box position: absolute + top: 0 + left: 0 + height: calc(100% - 20px) + width: calc(100% - 20px) float: left - top: 60px - left: 20px - width: 47% - .card-details-right - position: absolute - float: right - top: 20px - left: 50% + .card-details-left + float: left + top: 60px + left: 20px + width: 47% - .card-details-header - width: 47% + .card-details-right + position: absolute + float: right + top: 20px + left: 50% + + .card-details-header + width: 47% input[type="text"].attachment-add-link-input float: left @@ -297,6 +302,8 @@ input[type="submit"].attachment-add-link-submit padding: 0px 20px 0px 20px margin: 0px transition: none + overflow-y: revert + overflow-x: revert .card-details-canvas width: 100% @@ -315,6 +322,21 @@ input[type="submit"].attachment-add-link-submit .minimize-card-details margin-right: 40px + .card-details-popup + padding: 0px 10px + + .pop-over > .content-wrapper > .popup-container-depth-0 + width: 100% + + & > .content + width: calc(100% - 10px) + + & > .content > .card-details-popup hr + margin: 15px 0px + + .card-details-header + margin: 0 + card-details-color(background, color...) background: background !important if color diff --git a/client/components/cards/cardTime.js b/client/components/cards/cardTime.js index d8a41aaa0..984f048e1 100644 --- a/client/components/cards/cardTime.js +++ b/client/components/cards/cardTime.js @@ -9,7 +9,6 @@ BlazeComponent.extendComponent({ toggleOvertime() { this.card.setIsOvertime(!this.card.getIsOvertime()); $('#overtime .materialCheckBox').toggleClass('is-checked'); - $('#overtime').toggleClass('is-checked'); }, storeTime(spentTime, isOvertime) { @@ -18,6 +17,7 @@ BlazeComponent.extendComponent({ }, deleteTime() { this.card.setSpentTime(null); + this.card.setIsOvertime(false); }, events() { return [ @@ -27,11 +27,14 @@ BlazeComponent.extendComponent({ evt.preventDefault(); const spentTime = parseFloat(evt.target.time.value); - const isOvertime = this.card.getIsOvertime(); - + //const isOvertime = this.card.getIsOvertime(); + let isOvertime = false; + if ($('#overtime').attr('class').indexOf('is-checked') >= 0) { + isOvertime = true; + } if (spentTime >= 0) { this.storeTime(spentTime, isOvertime); - Popup.close(); + Popup.back(); } else { this.error.set('invalid-time'); evt.target.time.focus(); @@ -40,7 +43,7 @@ BlazeComponent.extendComponent({ 'click .js-delete-time'(evt) { evt.preventDefault(); this.deleteTime(); - Popup.close(); + Popup.back(); }, 'click a.js-toggle-overtime': this.toggleOvertime, }, diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 6c7b517c7..531ada257 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -12,20 +12,15 @@ template(name="checklists") input.toggle-switch(type="checkbox" id="toggleHideCheckedItemsButton") label.toggle-label(for="toggleHideCheckedItemsButton") - if toggleDeleteDialog.get - .board-overlay#card-details-overlay - +checklistDeleteDialog(checklist = checklistToDelete) - - .card-checklist-items - each checklist in currentCard.checklists + each checklist in checklists +checklistDetail(checklist = checklist) if canModifyCard +inlinedForm(autoclose=false classNames="js-add-checklist" cardId = cardId) +addChecklistItemForm else - a.js-open-inlined-form(title="{{_ 'add-checklist'}}") + a.add-checklist.js-open-inlined-form(title="{{_ 'add-checklist'}}") i.fa.fa-plus template(name="checklistDetail") @@ -50,25 +45,21 @@ template(name="checklistDetail") = checklist.title +checklistItems(checklist = checklist) -template(name="checklistDeleteDialog") - .js-confirm-checklist-delete - p - i(class="fa fa-exclamation-triangle" aria-hidden="true") - p - | {{_ 'confirm-checklist-delete-dialog'}} - span {{checklist.title}} - | ? - .js-checklist-delete-buttons - button.confirm-checklist-delete(type="button") {{_ 'delete'}} - button.toggle-delete-checklist-dialog(type="button") {{_ 'cancel'}} +template(name="checklistDeletePopup") + p {{_ 'confirm-checklist-delete-popup'}} + button.js-confirm.negate.full(type="submit") {{_ 'delete'}} template(name="addChecklistItemForm") + a.fa.fa-copy(title="{{_ 'copy-text-to-clipboard'}}") + span.copied-tooltip {{_ 'copied'}} textarea.js-add-checklist-item(rows='1' autofocus) .edit-controls.clearfix button.primary.confirm.js-submit-add-checklist-item-form(type="submit") {{_ 'save'}} a.fa.fa-times-thin.js-close-inlined-form template(name="editChecklistItemForm") + a.fa.fa-copy(title="{{_ 'copy-text-to-clipboard'}}") + span.copied-tooltip {{_ 'copied'}} textarea.js-edit-checklist-item(rows='1' autofocus dir="auto") if $eq type 'item' = item.title diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 0141f8ed5..a1e76cd34 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -13,10 +13,10 @@ function initSorting(items) { appendTo: 'parent', distance: 7, placeholder: 'checklist-item placeholder', - scroll: false, + scroll: true, start(evt, ui) { ui.placeholder.height(ui.helper.height()); - EscapeActions.executeUpTo('popup-close'); + EscapeActions.clickExecute(evt.target, 'inlinedForm'); }, stop(evt, ui) { const parent = ui.item.parents('.js-checklist-items'); @@ -55,7 +55,7 @@ BlazeComponent.extendComponent({ return Meteor.user() && Meteor.user().isBoardMember(); } - // Disable sorting if the current user is not a board member or is a miniscreen + // Disable sorting if the current user is not a board member self.autorun(() => { const $itemsDom = $(self.itemsDom); if ($itemsDom.data('uiSortable') || $itemsDom.data('sortable')) { @@ -94,16 +94,14 @@ BlazeComponent.extendComponent({ title, sort: card.checklists().count(), }); + this.closeAllInlinedForms(); setTimeout(() => { this.$('.add-checklist-item') .last() .click(); }, 100); } - textarea.value = ''; - textarea.focus(); }, - addChecklistItem(event) { event.preventDefault(); const textarea = this.find('textarea.js-add-checklist-item'); @@ -132,14 +130,6 @@ BlazeComponent.extendComponent({ ); }, - deleteChecklist() { - const checklist = this.currentData().checklist; - if (checklist && checklist._id) { - Checklists.remove(checklist._id); - this.toggleDeleteDialog.set(false); - } - }, - deleteItem() { const checklist = this.currentData().checklist; const item = this.currentData().item; @@ -165,11 +155,6 @@ BlazeComponent.extendComponent({ item.setTitle(title); }, - onCreated() { - this.toggleDeleteDialog = new ReactiveVar(false); - this.checklistToDelete = null; //Store data context to pass to checklistDeleteDialog template - }, - pressKey(event) { //If user press enter key inside a form, submit it //Unless the user is also holding down the 'shift' key @@ -190,14 +175,13 @@ BlazeComponent.extendComponent({ } }, + /** closes all inlined forms (checklist and checklist-item input fields) */ + closeAllInlinedForms() { + this.$('.js-close-inlined-form').click(); + }, + events() { const events = { - 'click .toggle-delete-checklist-dialog'(event) { - if ($(event.target).hasClass('js-delete-checklist')) { - this.checklistToDelete = this.currentData().checklist; //Store data context - } - this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get()); - }, 'click #toggleHideCheckedItemsButton'() { Meteor.call('toggleHideCheckedItems'); }, @@ -206,14 +190,22 @@ BlazeComponent.extendComponent({ return [ { ...events, + 'click .toggle-delete-checklist-dialog' : Popup.afterConfirm('checklistDelete', function () { + Popup.close(); + const checklist = this.checklist; + if (checklist && checklist._id) { + Checklists.remove(checklist._id); + } + }), 'submit .js-add-checklist': this.addChecklist, 'submit .js-edit-checklist-title': this.editChecklist, 'submit .js-add-checklist-item': this.addChecklistItem, 'submit .js-edit-checklist-item': this.editChecklistItem, 'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'), 'click .js-delete-checklist-item': this.deleteItem, - 'click .confirm-checklist-delete': this.deleteChecklist, 'focus .js-add-checklist-item': this.focusChecklistItem, + // add and delete checklist / checklist-item + 'click .js-open-inlined-form': this.closeAllInlinedForms, keydown: this.pressKey, }, ]; @@ -262,6 +254,11 @@ BlazeComponent.extendComponent({ }).register('boardsSwimlanesAndLists'); Template.checklists.helpers({ + checklists() { + const card = Cards.findOne(this.cardId); + const ret = card.checklists(); + return ret; + }, hideCheckedItems() { const currentUser = Meteor.user(); if (currentUser) return currentUser.hasHideCheckedItems(); @@ -269,39 +266,59 @@ Template.checklists.helpers({ }, }); -Template.addChecklistItemForm.onRendered(() => { - autosize($('textarea.js-add-checklist-item')); -}); +BlazeComponent.extendComponent({ + onRendered() { + autosize(this.$('textarea.js-add-checklist-item')); + }, + canModifyCard() { + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() && + !Meteor.user().isWorker() + ); + }, + events() { + return [ + { + 'click a.fa.fa-copy'(event) { + const $editor = this.$('textarea'); + const promise = Utils.copyTextToClipboard($editor[0].value); -Template.editChecklistItemForm.onRendered(() => { - autosize($('textarea.js-edit-checklist-item')); -}); + const $tooltip = this.$('.copied-tooltip'); + Utils.showCopied(promise, $tooltip); + }, + } + ]; + } +}).register('addChecklistItemForm'); -Template.checklistDeleteDialog.onCreated(() => { - const $cardDetails = this.$('.card-details'); - this.scrollState = { - position: $cardDetails.scrollTop(), //save current scroll position - top: false, //required for smooth scroll animation - }; - //Callback's purpose is to only prevent scrolling after animation is complete - $cardDetails.animate({ scrollTop: 0 }, 500, () => { - this.scrollState.top = true; - }); +BlazeComponent.extendComponent({ + onRendered() { + autosize(this.$('textarea.js-edit-checklist-item')); + }, + canModifyCard() { + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() && + !Meteor.user().isWorker() + ); + }, + events() { + return [ + { + 'click a.fa.fa-copy'(event) { + const $editor = this.$('textarea'); + const promise = Utils.copyTextToClipboard($editor[0].value); - //Prevent scrolling while dialog is open - $cardDetails.on('scroll', () => { - if (this.scrollState.top) { - //If it's already in position, keep it there. Otherwise let animation scroll - $cardDetails.scrollTop(0); - } - }); -}); - -Template.checklistDeleteDialog.onDestroyed(() => { - const $cardDetails = this.$('.card-details'); - $cardDetails.off('scroll'); //Reactivate scrolling - $cardDetails.animate({ scrollTop: this.scrollState.position }); -}); + const $tooltip = this.$('.copied-tooltip'); + Utils.showCopied(promise, $tooltip); + }, + } + ]; + } +}).register('editChecklistItemForm'); Template.checklistItemDetail.helpers({ canModifyCard() { diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl index 1b855d431..b78da0600 100644 --- a/client/components/cards/checklists.styl +++ b/client/components/cards/checklists.styl @@ -47,41 +47,6 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item padding-top: 3px float: left - -.js-confirm-checklist-delete - background-color: darken(white, 3%) - position: absolute - float: left; - width: 60% - margin-top: 0 - margin-left: 13% - padding-bottom: 2% - padding-left: 3% - padding-right: 3% - z-index: 17 - border-radius: 3px - - p - position: relative - margin-top: 3% - width: 100% - text-align: center - span - font-weight: bold - - i - font-size: 2em - - .js-checklist-delete-buttons - position: relative - padding: left 2% right 2% - .confirm-checklist-delete - margin-left: 12% - float: left - .toggle-delete-checklist-dialog - margin-right: 12% - float: right - #card-details-overlay top: 0 bottom: -600px @@ -167,4 +132,13 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item .add-checklist-item margin: 0.2em 0 0.5em 1.33em - display: inline-block + +.add-checklist-item,.add-checklist + &.js-open-inlined-form + display: block + width: 50% + + &:hover + background: #dbdbdb + color: #222 + box-shadow: 0 1px 2px rgba(0,0,0,.2) diff --git a/client/components/cards/labels.jade b/client/components/cards/labels.jade index 48e28b348..b5a5c0c1d 100644 --- a/client/components/cards/labels.jade +++ b/client/components/cards/labels.jade @@ -27,9 +27,11 @@ template(name="deleteLabelPopup") template(name="cardLabelsPopup") ul.edit-labels-pop-over each board.labels - li + li.js-card-label-item a.card-label-edit-button.fa.fa-pencil.js-edit-label - span.card-label.card-label-selectable.js-select-label(class="card-label-{{color}}" + if isMiniScreenOrShowDesktopDragHandles + span.fa.label-handle(class="fa-arrows" title="{{_ 'dragLabel'}}") + span.card-label.card-label-selectable.js-select-label.card-label-wrapper(class="card-label-{{color}}" class="{{# if isLabelSelected ../_id }}active{{/if}}") +viewer = name diff --git a/client/components/cards/labels.js b/client/components/cards/labels.js index 1e156f542..fc48f75f4 100644 --- a/client/components/cards/labels.js +++ b/client/components/cards/labels.js @@ -39,15 +39,67 @@ Template.createLabelPopup.helpers({ }, }); -Template.cardLabelsPopup.events({ - 'click .js-select-label'(event) { - const card = Cards.findOne(Session.get('currentCard')); - const labelId = this._id; - card.toggleLabel(labelId); - event.preventDefault(); +BlazeComponent.extendComponent({ + onRendered() { + const itemsSelector = 'li.js-card-label-item:not(.placeholder)'; + const $labels = this.$('.edit-labels-pop-over'); + + $labels.sortable({ + connectWith: '.edit-labels-pop-over', + tolerance: 'pointer', + appendTo: '.edit-labels-pop-over', + helper(element, currentItem) { + let ret = currentItem.clone(); + if (currentItem.closest('.popup-container-depth-0').size() == 0) + { // only set css transform at every sub-popup, not at the main popup + const content = currentItem.closest('.content')[0] + const offsetLeft = content.offsetLeft; + const offsetTop = $('.pop-over > .header').height() * -1; + ret.css("transform", `translate(${offsetLeft}px, ${offsetTop}px)`); + } + return ret; + }, + distance: 7, + items: itemsSelector, + placeholder: 'card-label-wrapper placeholder', + start(evt, ui) { + ui.helper.css('z-index', 1000); + ui.placeholder.height(ui.helper.height()); + EscapeActions.clickExecute(evt.target, 'inlinedForm'); + }, + stop(evt, ui) { + const newLabelOrderOnlyIds = ui.item.parent().children().toArray().map(_element => Blaze.getData(_element)._id) + const card = Blaze.getData(this); + card.board().setNewLabelOrder(newLabelOrderOnlyIds); + }, + }); + + // Disable drag-dropping if the current user is not a board member or is comment only + this.autorun(() => { + if (Utils.isMiniScreenOrShowDesktopDragHandles()) { + $labels.sortable({ + handle: '.label-handle', + }); + } + }); }, - 'click .js-edit-label': Popup.open('editLabel'), - 'click .js-add-label': Popup.open('createLabel'), + events() { + return [ + { + 'click .js-select-label'(event) { + const card = this.data(); + const labelId = this.currentData()._id; + card.toggleLabel(labelId); + event.preventDefault(); + }, + 'click .js-edit-label': Popup.open('editLabel'), + 'click .js-add-label': Popup.open('createLabel'), + } + ]; + } +}).register('cardLabelsPopup'); + +Template.cardLabelsPopup.events({ }); Template.formLabel.events({ diff --git a/client/components/cards/labels.styl b/client/components/cards/labels.styl index 0e192e59f..700ff1044 100644 --- a/client/components/cards/labels.styl +++ b/client/components/cards/labels.styl @@ -2,6 +2,7 @@ // XXX Use .board-widget-labels as a flexbox container .card-label + border: 1px solid #000000 border-radius: 4px color: white //Default white text, in select cases, changed to black to improve contrast between label colour and text display: inline-block @@ -12,10 +13,11 @@ padding: 3px 8px max-width: 210px min-width: 8px - overflow: ellipsis word-wrap: break-word - height: 18px - vertical-align: bottom + min-height: 18px + vertical-align: middle + white-space: initial + overflow: initial &:hover color: white @@ -27,12 +29,13 @@ &.add-label box-shadow: 0 0 0 2px darken(white, 25%) inset + border: initial &:hover, &.is-active box-shadow: 0 0 0 2px darken(white, 60%) inset - i.fa-plus - margin-top: 3px + p + margin: 0px .palette-colors display: flex @@ -47,7 +50,6 @@ .card-label-white background-color: #ffffff color: #000000 //Black text for better visibility - border: 1px solid #c0c0c0 .card-label-white:hover color: #aaaaaa //grey text for better visibility @@ -144,6 +146,7 @@ height: 25px margin: 0px 3% 7px 0px width: 10.5% + max-width: 10.5% cursor: pointer .edit-labels @@ -220,3 +223,9 @@ &:hover background: #dbdbdb +ul.edit-labels-pop-over + span.fa.label-handle + padding-right: 10px; + + span.fa.label-handle + .card-label + max-width: 180px diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 985318e4f..6b4eafcfe 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -2,21 +2,17 @@ template(name="minicard") .minicard( class="{{#if isLinkedCard}}linked-card{{/if}}" class="{{#if isLinkedBoard}}linked-board{{/if}}" - class="minicard-{{colorClass}}") - if isMiniScreen + class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}") + if isMiniScreenOrShowDesktopDragHandles .handle .fa.fa-arrows - unless isMiniScreen - if showDesktopDragHandles - .handle - .fa.fa-arrows if cover .minicard-cover(style="background-image: url('{{cover.url}}');") if labels - .minicard-labels + .minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}") each labels unless hiddenMinicardLabelText - span.card-label(class="card-label-{{color}}" title=name) + span.js-card-label.card-label(class="card-label-{{color}}" title=name) +viewer = name if hiddenMinicardLabelText @@ -92,15 +88,17 @@ template(name="minicard") +viewer = trueValue - if getAssignees - .minicard-assignees.js-minicard-assignees - each getAssignees - +userAvatar(userId=this) + if showAssignee + if getAssignees + .minicard-assignees.js-minicard-assignees + each getAssignees + +userAvatar(userId=this) - if getMembers - .minicard-members.js-minicard-members - each getMembers - +userAvatar(userId=this) + if showMembers + if getMembers + .minicard-members.js-minicard-members + each getMembers + +userAvatar(userId=this) if showCreator .minicard-creator @@ -145,4 +143,9 @@ template(name="minicard") if currentBoard.allowsCardSortingByNumber .badge span.badge-icon.fa.fa-sort - span.badge-text {{ sort }} + span.badge-text.check-list-sort {{ sort }} + +template(name="editCardSortOrderPopup") + input.js-edit-card-sort-popup(type='text' autofocus value=sort dir="auto") + .edit-controls.clearfix + button.primary.confirm.js-submit-edit-card-sort-popup(type="submit") {{_ 'save'}} diff --git a/client/components/cards/minicard.js b/client/components/cards/minicard.js index 9ffe3609f..6a2057c34 100644 --- a/client/components/cards/minicard.js +++ b/client/components/cards/minicard.js @@ -49,6 +49,38 @@ BlazeComponent.extendComponent({ return false; }, + showMembers() { + if (this.data().board()) { + return ( + this.data().board.allowsMembers === null || + this.data().board().allowsMembers === undefined || + this.data().board().allowsMembers + ); + } + return false; + }, + + showAssignee() { + if (this.data().board()) { + return ( + this.data().board.allowsAssignee === null || + this.data().board().allowsAssignee === undefined || + this.data().board().allowsAssignee + ); + } + return false; + }, + + /** opens the card label popup only if clicked onto a label + *
  • this is necessary to have the data context of the minicard. + * if .js-card-label is used at click event, then only the data context of the label itself is available at this.currentData() + */ + cardLabelsPopup(event) { + if (this.find('.js-card-label:hover')) { + Popup.open("cardLabels")(event, {dataContextIfCurrentDataIsUndefined: this.currentData()}); + } + }, + events() { return [ { @@ -57,8 +89,6 @@ BlazeComponent.extendComponent({ else if (this.data().isLinkedBoard()) Utils.goBoardId(this.data().linkedId); }, - }, - { 'click .js-toggle-minicard-label-text'() { if (window.localStorage.getItem('hiddenMinicardLabelText')) { window.localStorage.removeItem('hiddenMinicardLabelText'); //true @@ -66,22 +96,14 @@ BlazeComponent.extendComponent({ window.localStorage.setItem('hiddenMinicardLabelText', 'true'); //true } }, - }, + 'click span.badge-icon.fa.fa-sort, click span.badge-text.check-list-sort' : Popup.open("editCardSortOrder"), + 'click .minicard-labels' : this.cardLabelsPopup, + } ]; }, }).register('minicard'); Template.minicard.helpers({ - showDesktopDragHandles() { - currentUser = Meteor.user(); - if (currentUser) { - return (currentUser.profile || {}).showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - return true; - } else { - return false; - } - }, hiddenMinicardLabelText() { currentUser = Meteor.user(); if (currentUser) { @@ -93,3 +115,30 @@ Template.minicard.helpers({ } }, }); + +BlazeComponent.extendComponent({ + events() { + return [ + { + 'keydown input.js-edit-card-sort-popup'(evt) { + // enter = save + if (evt.keyCode === 13) { + this.find('button[type=submit]').click(); + } + }, + 'click button.js-submit-edit-card-sort-popup'(event) { + // save button pressed + event.preventDefault(); + const sort = this.$('.js-edit-card-sort-popup')[0] + .value + .trim(); + if (!Number.isNaN(sort)) { + let card = this.data(); + card.move(card.boardId, card.swimlaneId, card.listId, sort); + Popup.back(); + } + }, + } + ] + } +}).register('editCardSortOrderPopup'); diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl index 7f7c1c7ed..516eabe9a 100644 --- a/client/components/cards/minicard.styl +++ b/client/components/cards/minicard.styl @@ -80,8 +80,6 @@ .minicard-labels float: none - display: flex - flex-wrap: wrap .minicard-label width: 11px @@ -90,6 +88,10 @@ margin-right: 3px margin-bottom: 3px + .minicard-labels-no-text + display: flex + flex-wrap: wrap + .minicard-custom-fields display:block; .minicard-custom-field diff --git a/client/components/cards/resultCard.jade b/client/components/cards/resultCard.jade index cf001532b..ae6e90722 100644 --- a/client/components/cards/resultCard.jade +++ b/client/components/cards/resultCard.jade @@ -1,6 +1,6 @@ template(name="resultCard") .result-card-wrapper - a.minicard-wrapper.card-title(href=originRelativeUrl) + a.minicard-wrapper.js-minicard.card-title(href=originRelativeUrl) +minicard(this) //= card.title ul.result-card-context-list diff --git a/client/components/cards/resultCard.js b/client/components/cards/resultCard.js index 3b5da12cf..8e04f1654 100644 --- a/client/components/cards/resultCard.js +++ b/client/components/cards/resultCard.js @@ -5,7 +5,31 @@ Template.resultCard.helpers({ }); BlazeComponent.extendComponent({ + clickOnMiniCard(evt) { + evt.preventDefault(); + const this_ = this; + const cardId = this.currentData()._id; + const boardId = this.currentData().boardId; + Meteor.subscribe('popupCardData', cardId, { + onReady() { + Session.set('popupCardId', cardId); + Session.set('popupCardBoardId', boardId); + this_.cardDetailsPopup(evt); + }, + }); + }, + + cardDetailsPopup(event) { + if (!Popup.isOpen()) { + Popup.open("cardDetails")(event); + } + }, + events() { - return [{}]; + return [ + { + 'click .js-minicard': this.clickOnMiniCard, + }, + ]; }, }).register('resultCard'); diff --git a/client/components/cards/subtasks.js b/client/components/cards/subtasks.js index 4cd15c114..79bc210fc 100644 --- a/client/components/cards/subtasks.js +++ b/client/components/cards/subtasks.js @@ -37,6 +37,8 @@ BlazeComponent.extendComponent({ ? targetBoard.getDefaultSwimline()._id : targetSwimlane._id; + const nextCardNumber = targetBoard.getNextCardNumber(); + if (title) { const _id = Cards.insert({ title, @@ -49,6 +51,7 @@ BlazeComponent.extendComponent({ sort: sortIndex, swimlaneId, type: 'cardType-card', + cardNumber: nextCardNumber }); // In case the filter is active we need to add the newly inserted card in diff --git a/client/components/forms/forms.styl b/client/components/forms/forms.styl index d41ea4e62..ce1a5adf1 100644 --- a/client/components/forms/forms.styl +++ b/client/components/forms/forms.styl @@ -247,6 +247,7 @@ textarea position: absolute left: -9999px visibility: hidden + display: none .materialCheckBox position: relative diff --git a/client/components/lists/list.js b/client/components/lists/list.js index 1cfbaff9a..0f953ae36 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -1,3 +1,5 @@ +require('/client/lib/jquery-ui.js') + const { calculateIndex } = Utils; BlazeComponent.extendComponent({ @@ -93,7 +95,7 @@ BlazeComponent.extendComponent({ $cards.sortable('cancel'); if (MultiSelection.isActive()) { - Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => { + Cards.find(MultiSelection.getMongoSelector(), {sort: ['sort']}).forEach((card, i) => { const newSwimlaneId = targetSwimlaneId ? targetSwimlaneId : card.swimlaneId || defaultSwimlaneId; @@ -114,25 +116,51 @@ BlazeComponent.extendComponent({ } boardComponent.setIsDragging(false); }, + sort(event, ui) { + const $boardCanvas = $('.board-canvas'); + const boardCanvas = $boardCanvas[0]; + + if (event.pageX < 10) + { // scroll to the left + boardCanvas.scrollLeft -= 15; + ui.helper[0].offsetLeft -= 15; + } + if ( + event.pageX > boardCanvas.offsetWidth - 10 && + boardCanvas.scrollLeft < $boardCanvas.data('scrollLeftMax') // don't scroll more than possible + ) + { // scroll to the right + boardCanvas.scrollLeft += 15; + } + if ( + event.pageY > boardCanvas.offsetHeight - 10 && + event.pageY + boardCanvas.scrollTop < $boardCanvas.data('scrollTopMax') // don't scroll more than possible + ) + { // scroll to the bottom + boardCanvas.scrollTop += 15; + } + if (event.pageY < 10) + { // scroll to the top + boardCanvas.scrollTop -= 15; + } + }, + activate(event, ui) { + const $boardCanvas = $('.board-canvas'); + const boardCanvas = $boardCanvas[0]; + // scrollTopMax and scrollLeftMax only available at Firefox (https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTopMax) + // https://www.it-swarm.com.de/de/javascript/so-erhalten-sie-den-maximalen-dokument-scrolltop-wert/1069126844/ + $boardCanvas.data('scrollTopMax', boardCanvas.scrollHeight - boardCanvas.clientTop); + // https://stackoverflow.com/questions/5138373/how-do-i-get-the-max-value-of-scrollleft/5704386#5704386 + $boardCanvas.data('scrollLeftMax', boardCanvas.scrollWidth - boardCanvas.clientWidth); + }, }); this.autorun(() => { - let showDesktopDragHandles = false; - currentUser = Meteor.user(); - if (currentUser) { - showDesktopDragHandles = (currentUser.profile || {}) - .showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - showDesktopDragHandles = true; - } else { - showDesktopDragHandles = false; - } - - if (Utils.isMiniScreen() || showDesktopDragHandles) { + if (Utils.isMiniScreenOrShowDesktopDragHandles()) { $cards.sortable({ handle: '.handle', }); - } else if (!Utils.isMiniScreen() && !showDesktopDragHandles) { + } else { $cards.sortable({ handle: '.minicard', }); @@ -178,19 +206,6 @@ BlazeComponent.extendComponent({ }, }).register('list'); -Template.list.helpers({ - showDesktopDragHandles() { - currentUser = Meteor.user(); - if (currentUser) { - return (currentUser.profile || {}).showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - return true; - } else { - return false; - } - }, -}); - Template.miniList.events({ 'click .js-select-list'() { const listId = this._id; diff --git a/client/components/lists/list.styl b/client/components/lists/list.styl index 368394ae1..a80879ebf 100644 --- a/client/components/lists/list.styl +++ b/client/components/lists/list.styl @@ -85,13 +85,9 @@ color: #a6a6a6 .list-header-menu - position: absolute - padding: 27px 19px - margin-top: 1px - top: -7px - right: 3px + float: right - .list-header-plus-icon + .list-header-plus-top color: #a6a6a6 margin-right: 15px @@ -100,9 +96,10 @@ .cardCount color: #8c8c8c - font-size: 0.8em + font-size: 12px + font-weight: bold -.list-header .list-header-plus-icon, .js-open-list-menu, .list-header-menu a +.list-header .list-header-plus-top, .js-open-list-menu, .list-header-menu a color #4d4d4d padding-left 4px @@ -160,18 +157,6 @@ float: left @media screen and (max-width: 800px) - .list-header-menu - position: absolute - padding: 27px 19px - margin-top: 1px - top: -7px - margin-right: 7px - right: -3px - - .list-header - .list-header-name - margin-left: 1.4rem - .mini-list flex: 0 0 60px height: auto @@ -215,7 +200,6 @@ display: flex align-items: center .list-header-left-icon - display: inline padding: 7px padding-right: 27px margin-top: 1px @@ -238,6 +222,30 @@ right: 10px font-size: 24px + .list-header + display: grid + grid-template-columns: 30px 5fr 1fr + .list-header-left-icon + display: grid + grid-row: 1/3 + grid-column: 1 + .list-header-name + grid-row: 1 + grid-column: 2 + align-self: end + .cardCount + grid-row: 2 + grid-column: 2 + align-self: start + .list-header-menu + grid-row: 1/3 + grid-column: 3 + .inlined-form + grid-row: 1/3 + grid-column: 1/4 + .edit-controls + align-items: initial + .link-board-wrapper display: flex align-items: baseline diff --git a/client/components/lists/listBody.jade b/client/components/lists/listBody.jade index b286347a9..e42796e7d 100644 --- a/client/components/lists/listBody.jade +++ b/client/components/lists/listBody.jade @@ -4,6 +4,17 @@ template(name="listBody") if cards.count +inlinedForm(autoclose=false position="top") +addCardForm(listId=_id position="top") + ul.sidebar-list + each customFieldsSum + li + +viewer + = name + if $eq customFieldsSum.type "number" + +viewer + = value + if $eq customFieldsSum.type "currency" + +viewer + = formattedCurrencyCustomFieldValue(value) each (cardsWithLimit (idOrNull ../../_id)) a.minicard-wrapper.js-minicard(href=originRelativeUrl class="{{#if cardIsSelected}}is-selected{{/if}}" @@ -42,6 +53,7 @@ template(name="addCardForm") .add-controls.clearfix button.primary.confirm(type="submit") {{_ 'add'}} + a.fa.fa-times-thin.js-close-inlined-form unless currentBoard.isTemplatesBoard unless currentBoard.isTemplateBoard span.quiet diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index 5d1e76aa0..bb03d72cd 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -13,6 +13,13 @@ BlazeComponent.extendComponent({ return []; }, + customFieldsSum() { + return CustomFields.find({ + boardIds: { $in: [Session.get('currentBoard')] }, + showSumAtTopOfList: true, + }); + }, + openForm(options) { options = options || {}; options.position = options.position || 'top'; @@ -141,6 +148,10 @@ BlazeComponent.extendComponent({ // If the card is already selected, we want to de-select it. // XXX We should probably modify the minicard href attribute instead of // overwriting the event in case the card is already selected. + } else if (Utils.isMiniScreen()) { + evt.preventDefault(); + Session.set('popupCardId', this.currentData()._id); + this.cardDetailsPopup(evt); } else if (Session.equals('currentCard', this.currentData()._id)) { evt.stopImmediatePropagation(); evt.preventDefault(); @@ -209,6 +220,12 @@ BlazeComponent.extendComponent({ ); }, + cardDetailsPopup(event) { + if (!Popup.isOpen()) { + Popup.open("cardDetails")(event); + } + }, + events() { return [ { @@ -479,7 +496,7 @@ BlazeComponent.extendComponent({ evt.preventDefault(); const linkedId = $('.js-select-cards option:selected').val(); if (!linkedId) { - Popup.close(); + Popup.back(); return; } const _id = Cards.insert({ @@ -494,7 +511,7 @@ BlazeComponent.extendComponent({ linkedId, }); Filter.addException(_id); - Popup.close(); + Popup.back(); }, 'click .js-link-board'(evt) { //LINK BOARD @@ -505,7 +522,7 @@ BlazeComponent.extendComponent({ !impBoardId || Cards.findOne({ linkedId: impBoardId, archived: false }) ) { - Popup.close(); + Popup.back(); return; } const _id = Cards.insert({ @@ -520,7 +537,7 @@ BlazeComponent.extendComponent({ linkedId: impBoardId, }); Filter.addException(_id); - Popup.close(); + Popup.back(); }, }, ]; @@ -567,7 +584,7 @@ BlazeComponent.extendComponent({ }); } if (!board) { - Popup.close(); + Popup.back(); return; } const boardId = board._id; @@ -694,7 +711,7 @@ BlazeComponent.extendComponent({ }, ); } - Popup.close(); + Popup.back(); }, }, ]; @@ -782,17 +799,12 @@ BlazeComponent.extendComponent({ return false; } + const spinnerViewPosition = this.spinner.offsetTop - this.container.offsetTop + this.spinner.clientHeight; + const parentViewHeight = this.container.clientHeight; const bottomViewPosition = this.container.scrollTop + parentViewHeight; - let spinnerOffsetTop = this.spinner.offsetTop; - - const addCard = $(this.container).find("a.open-minicard-composer").first()[0]; - if (addCard !== undefined) { - spinnerOffsetTop -= addCard.clientHeight; - } - - return bottomViewPosition > spinnerOffsetTop; + return bottomViewPosition > spinnerViewPosition; } getSkSpinnerName() { diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index 9286ab122..e28eb04ee 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -18,9 +18,9 @@ template(name="listHeader") span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.count}} |/#{wipLimit.value}) - if showCardsCountForList cards.count - |  - span(class="cardCount") {{cardsCount}} {{_ 'cards-count'}} + if showCardsCountForList cards.count + span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.count}} + if isMiniScreen if currentList if isWatching @@ -28,7 +28,7 @@ template(name="listHeader") div.list-header-menu unless currentUser.isCommentOnly if canSeeAddCard - a.js-add-card.fa.fa-plus.list-header-plus-icon(title="{{_ 'add-card-to-top-of-list'}}") + a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}") a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}") else a.list-header-menu-icon.fa.fa-angle-right.js-select-list @@ -39,12 +39,12 @@ template(name="listHeader") div.list-header-menu unless currentUser.isCommentOnly //if isBoardAdmin - // a.fa.js-list-star.list-header-plus-icon(class="fa-star{{#unless starred}}-o{{/unless}}") + // a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}") if canSeeAddCard - a.js-add-card.fa.fa-plus.list-header-plus-icon(title="{{_ 'add-card-to-top-of-list'}}") + a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}") a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}") if currentUser.isBoardAdmin - if showDesktopDragHandles + if isShowDesktopDragHandles a.list-header-handle.handle.fa.fa-arrows.js-list-handle template(name="editListTitleForm") @@ -55,6 +55,13 @@ template(name="editListTitleForm") a.fa.fa-times-thin.js-close-inlined-form template(name="listActionPopup") + ul.pop-over-list + li + a.js-add-card.list-header-plus-bottom + i.fa.fa-plus + i.fa.fa-arrow-down + | {{_ 'add-card-to-bottom-of-list'}} + hr ul.pop-over-list li a.js-toggle-watch-list diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index 8afb35fba..547ba1bc8 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -85,6 +85,14 @@ BlazeComponent.extendComponent({ return limit >= 0 && count >= limit; }, + cardsCountForListIsOne(count) { + if (count === 1) { + return TAPi18n.__('cards-count-one'); + } else { + return TAPi18n.__('cards-count'); + } + }, + events() { return [ { @@ -93,7 +101,7 @@ BlazeComponent.extendComponent({ this.starred(!this.starred()); }, 'click .js-open-list-menu': Popup.open('listAction'), - 'click .js-add-card'(event) { + 'click .js-add-card.list-header-plus-top'(event) { const listDom = $(event.target).parents( `#js-list-${this.currentData()._id}`, )[0]; @@ -114,18 +122,7 @@ BlazeComponent.extendComponent({ Template.listHeader.helpers({ isBoardAdmin() { return Meteor.user().isBoardAdmin(); - }, - - showDesktopDragHandles() { - currentUser = Meteor.user(); - if (currentUser) { - return (currentUser.profile || {}).showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - return true; - } else { - return false; - } - }, + } }); Template.listActionPopup.helpers({ @@ -144,23 +141,31 @@ Template.listActionPopup.helpers({ Template.listActionPopup.events({ 'click .js-list-subscribe'() {}, + 'click .js-add-card.list-header-plus-bottom'(event) { + const listDom = $(`#js-list-${this._id}`)[0]; + const listComponent = BlazeComponent.getComponentForElement(listDom); + listComponent.openForm({ + position: 'bottom', + }); + Popup.back(); + }, 'click .js-set-color-list': Popup.open('setListColor'), 'click .js-select-cards'() { const cardIds = this.allCards().map(card => card._id); MultiSelection.add(cardIds); - Popup.close(); + Popup.back(); }, 'click .js-toggle-watch-list'() { const currentList = this; const level = currentList.findWatcher(Meteor.userId()) ? null : 'watching'; Meteor.call('watch', 'list', currentList._id, level, (err, ret) => { - if (!err && ret) Popup.close(); + if (!err && ret) Popup.back(); }); }, 'click .js-close-list'(event) { event.preventDefault(); this.archive(); - Popup.close(); + Popup.back(); }, 'click .js-set-wip-limit': Popup.open('setWipLimit'), 'click .js-more': Popup.open('listMore'), @@ -236,7 +241,7 @@ BlazeComponent.extendComponent({ Template.listMorePopup.events({ 'click .js-delete': Popup.afterConfirm('listDelete', function() { - Popup.close(); + Popup.back(); // TODO how can we avoid the fetch call? const allCards = this.allCards().fetch(); const allCardIds = _.pluck(allCards, '_id'); @@ -302,11 +307,11 @@ BlazeComponent.extendComponent({ }, 'click .js-submit'() { this.currentList.setColor(this.currentColor.get()); - Popup.close(); + Popup.back(); }, 'click .js-remove-color'() { this.currentList.setColor(null); - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/main/dueCards.js b/client/components/main/dueCards.js index 4841ddb27..f4d90ea56 100644 --- a/client/components/main/dueCards.js +++ b/client/components/main/dueCards.js @@ -38,12 +38,12 @@ BlazeComponent.extendComponent({ { 'click .js-due-cards-view-me'() { Utils.setDueCardsView('me'); - Popup.close(); + Popup.back(); }, 'click .js-due-cards-view-all'() { Utils.setDueCardsView('all'); - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/main/editor.jade b/client/components/main/editor.jade index dbd617154..2bedac612 100644 --- a/client/components/main/editor.jade +++ b/client/components/main/editor.jade @@ -1,4 +1,6 @@ template(name="editor") + a.fa.fa-copy(title="{{_ 'copy-text-to-clipboard'}}") + span.copied-tooltip {{_ 'copied'}} textarea.editor( dir="auto" class="{{class}}" diff --git a/client/components/main/editor.js b/client/components/main/editor.js index 09ce2a015..fec040a23 100644 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -4,281 +4,299 @@ const specialHandles = [ ]; const specialHandleNames = specialHandles.map(m => m.username); -Template.editor.onRendered(() => { - const textareaSelector = 'textarea'; - const mentions = [ - // User mentions - { - match: /\B@([\w.]*)$/, - search(term, callback) { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - callback( - _.union( - currentBoard - .activeMembers() - .map(member => { - const username = Users.findOne(member.userId).username; - return username.includes(term) ? username : null; - }) - .filter(Boolean), [...specialHandleNames]) - ); - }, - template(value) { - return value; - }, - replace(username) { - return `@${username} `; - }, - index: 1, - }, - ]; - const enableTextarea = function() { - const $textarea = this.$(textareaSelector); - autosize($textarea); - $textarea.escapeableTextComplete(mentions); - }; - if (Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR !== false) { - const isSmall = Utils.isMiniScreen(); - const toolbar = isSmall - ? [ - ['view', ['fullscreen']], - ['table', ['table']], - ['font', ['bold', 'underline']], - //['fontsize', ['fontsize']], - ['color', ['color']], - ] - : [ - ['style', ['style']], - ['font', ['bold', 'underline', 'clear']], - ['fontsize', ['fontsize']], - ['fontname', ['fontname']], - ['color', ['color']], - ['para', ['ul', 'ol', 'paragraph']], - ['table', ['table']], - //['insert', ['link', 'picture', 'video']], // iframe tag will be sanitized TODO if iframe[class=note-video-clip] can be added into safe list, insert video can be enabled - ['insert', ['link']], //, 'picture']], // modal popup has issue somehow :( - ['view', ['fullscreen', 'codeview', 'help']], - ]; - const cleanPastedHTML = function(input) { - const badTags = [ - 'style', - 'script', - 'applet', - 'embed', - 'noframes', - 'noscript', - 'meta', - 'link', - 'button', - 'form', - ].join('|'); - const badPatterns = new RegExp( - `(?:${[ - `<(${badTags})s*[^>][\\s\\S]*?<\\/\\1>`, - `<(${badTags})[^>]*?\\/>`, - ].join('|')})`, - 'gi', - ); - let output = input; - // remove bad Tags - output = output.replace(badPatterns, ''); - // remove attributes ' style="..."' - const badAttributes = new RegExp( - `(?:${[ - 'on\\S+=([\'"]?).*?\\1', - 'href=([\'"]?)javascript:.*?\\2', - 'style=([\'"]?).*?\\3', - 'target=\\S+', - ].join('|')})`, - 'gi', - ); - output = output.replace(badAttributes, ''); - output = output.replace(/( -1) { - return mSummernotes[idx]; - } - return undefined; - }; - inputs.each(function(idx, input) { - mSummernotes[idx] = $(input).summernote({ - placeholder, - callbacks: { - onInit(object) { - const originalInput = this; - $(originalInput).on('submitted', function() { - // when comment is submitted, the original textarea will be set to '', so shall we - if (!this.value) { - const sn = getSummernote(this); - sn && sn.summernote('code', ''); - } - }); - const jEditor = object && object.editable; - const toolbar = object && object.toolbar; - if (jEditor !== undefined) { - jEditor.escapeableTextComplete(mentions); - } - if (toolbar !== undefined) { - const fBtn = toolbar.find('.btn-fullscreen'); - fBtn.on('click', function() { - const $this = $(this), - isActive = $this.hasClass('active'); - $('.minicards,#header-quick-access').toggle(!isActive); // mini card is still showing when editor is in fullscreen mode, we hide here manually - }); - } - }, - onImageUpload(files) { - const $summernote = getSummernote(this); - if (files && files.length > 0) { - const image = files[0]; - const currentCard = Cards.findOne(Session.get('currentCard')); - const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL; - const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO; - const insertImage = src => { - // process all image upload types to the description/comment window - const img = document.createElement('img'); - img.src = src; - img.setAttribute('width', '100%'); - $summernote.summernote('insertNode', img); - }; - const processData = function(fileObj) { - Utils.processUploadedAttachment( - currentCard, - fileObj, - attachment => { - if ( - attachment && - attachment._id && - attachment.isImage() - ) { - attachment.one('uploaded', function() { - const maxTry = 3; - const checkItvl = 500; - let retry = 0; - const checkUrl = function() { - // even though uploaded event fired, attachment.url() is still null somehow //TODO - const url = attachment.url(); - if (url) { - insertImage( - `${location.protocol}//${location.host}${url}`, - ); - } else { - retry++; - if (retry < maxTry) { - setTimeout(checkUrl, checkItvl); +BlazeComponent.extendComponent({ + onRendered() { + const textareaSelector = 'textarea'; + const mentions = [ + // User mentions + { + match: /\B@([\w.]*)$/, + search(term, callback) { + const currentBoard = Boards.findOne(Session.get('currentBoard')); + callback( + _.union( + currentBoard + .activeMembers() + .map(member => { + const user = Users.findOne(member.userId); + const username = user.username; + const fullName = user.profile && user.profile !== undefined ? user.profile.fullname : ""; + return username.includes(term) || fullName.includes(term) ? fullName + "(" + username + ")" : null; + }) + .filter(Boolean), [...specialHandleNames]) + ); + }, + template(value) { + return value; + }, + replace(username) { + return `@${username} `; + }, + index: 1, + }, + ]; + const enableTextarea = function() { + const $textarea = this.$(textareaSelector); + autosize($textarea); + $textarea.escapeableTextComplete(mentions); + }; + if (Meteor.settings.public.RICHER_CARD_COMMENT_EDITOR !== false) { + const isSmall = Utils.isMiniScreen(); + const toolbar = isSmall + ? [ + ['view', ['fullscreen']], + ['table', ['table']], + ['font', ['bold', 'underline']], + //['fontsize', ['fontsize']], + ['color', ['color']], + ] + : [ + ['style', ['style']], + ['font', ['bold', 'underline', 'clear']], + ['fontsize', ['fontsize']], + ['fontname', ['fontname']], + ['color', ['color']], + ['para', ['ul', 'ol', 'paragraph']], + ['table', ['table']], + //['insert', ['link', 'picture', 'video']], // iframe tag will be sanitized TODO if iframe[class=note-video-clip] can be added into safe list, insert video can be enabled + ['insert', ['link']], //, 'picture']], // modal popup has issue somehow :( + ['view', ['fullscreen', 'codeview', 'help']], + ]; + const cleanPastedHTML = function(input) { + const badTags = [ + 'style', + 'script', + 'applet', + 'embed', + 'noframes', + 'noscript', + 'meta', + 'link', + 'button', + 'form', + ].join('|'); + const badPatterns = new RegExp( + `(?:${[ + `<(${badTags})s*[^>][\\s\\S]*?<\\/\\1>`, + `<(${badTags})[^>]*?\\/>`, + ].join('|')})`, + 'gi', + ); + let output = input; + // remove bad Tags + output = output.replace(badPatterns, ''); + // remove attributes ' style="..."' + const badAttributes = new RegExp( + `(?:${[ + 'on\\S+=([\'"]?).*?\\1', + 'href=([\'"]?)javascript:.*?\\2', + 'style=([\'"]?).*?\\3', + 'target=\\S+', + ].join('|')})`, + 'gi', + ); + output = output.replace(badAttributes, ''); + output = output.replace(/( -1) { + return mSummernotes[idx]; + } + return undefined; + }; + inputs.each(function(idx, input) { + mSummernotes[idx] = $(input).summernote({ + placeholder, + callbacks: { + onInit(object) { + const originalInput = this; + $(originalInput).on('submitted', function() { + // when comment is submitted, the original textarea will be set to '', so shall we + if (!this.value) { + const sn = getSummernote(this); + sn && sn.summernote('code', ''); + } + }); + const jEditor = object && object.editable; + const toolbar = object && object.toolbar; + if (jEditor !== undefined) { + jEditor.escapeableTextComplete(mentions); + } + if (toolbar !== undefined) { + const fBtn = toolbar.find('.btn-fullscreen'); + fBtn.on('click', function() { + const $this = $(this), + isActive = $this.hasClass('active'); + $('.minicards,#header-quick-access').toggle(!isActive); // mini card is still showing when editor is in fullscreen mode, we hide here manually + }); + } + }, + + onImageUpload(files) { + const $summernote = getSummernote(this); + if (files && files.length > 0) { + const image = files[0]; + const currentCard = Utils.getCurrentCard(); + const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL; + const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO; + const insertImage = src => { + // process all image upload types to the description/comment window + const img = document.createElement('img'); + img.src = src; + img.setAttribute('width', '100%'); + $summernote.summernote('insertNode', img); + }; + const processData = function(fileObj) { + Utils.processUploadedAttachment( + currentCard, + fileObj, + attachment => { + if ( + attachment && + attachment._id && + attachment.isImage() + ) { + attachment.one('uploaded', function() { + const maxTry = 3; + const checkItvl = 500; + let retry = 0; + const checkUrl = function() { + // even though uploaded event fired, attachment.url() is still null somehow //TODO + const url = attachment.url(); + if (url) { + insertImage( + `${location.protocol}//${location.host}${url}`, + ); + } else { + retry++; + if (retry < maxTry) { + setTimeout(checkUrl, checkItvl); + } } + }; + checkUrl(); + }); + } + }, + ); + }; + if (MAX_IMAGE_PIXEL) { + const reader = new FileReader(); + reader.onload = function(e) { + const dataurl = e && e.target && e.target.result; + if (dataurl !== undefined) { + // need to shrink image + Utils.shrinkImage({ + dataurl, + maxSize: MAX_IMAGE_PIXEL, + ratio: COMPRESS_RATIO, + toBlob: true, + callback(blob) { + if (blob !== false) { + blob.name = image.name; + processData(blob); } - }; - checkUrl(); + }, }); } - }, - ); - }; - if (MAX_IMAGE_PIXEL) { - const reader = new FileReader(); - reader.onload = function(e) { - const dataurl = e && e.target && e.target.result; - if (dataurl !== undefined) { - // need to shrink image - Utils.shrinkImage({ - dataurl, - maxSize: MAX_IMAGE_PIXEL, - ratio: COMPRESS_RATIO, - toBlob: true, - callback(blob) { - if (blob !== false) { - blob.name = image.name; - processData(blob); - } - }, - }); - } - }; - reader.readAsDataURL(image); - } else { - processData(image); + }; + reader.readAsDataURL(image); + } else { + processData(image); + } } - } - }, - onPaste(e) { - var clipboardData = e.clipboardData; - var pastedData = clipboardData.getData('Text'); + }, + onPaste(e) { + var clipboardData = e.clipboardData; + var pastedData = clipboardData.getData('Text'); - //if pasted data is an image, exit - if (!pastedData.length) { - e.preventDefault(); - return; - } + //if pasted data is an image, exit + if (!pastedData.length) { + e.preventDefault(); + return; + } - // clear up unwanted tag info when user pasted in text - const thisNote = this; - const updatePastedText = function(object) { - const someNote = getSummernote(object); - // Fix Pasting text into a card is adding a line before and after - // (and multiplies by pasting more) by changing paste "p" to "br". - // Fixes https://github.com/wekan/wekan/2890 . - // == Fix Start == - someNote.execCommand('defaultParagraphSeparator', false, 'br'); - // == Fix End == - const original = someNote.summernote('code'); - const cleaned = cleanPastedHTML(original); //this is where to call whatever clean function you want. I have mine in a different file, called CleanPastedHTML. - someNote.summernote('code', ''); //clear original - someNote.summernote('pasteHTML', cleaned); //this sets the displayed content editor to the cleaned pasted code. - }; - setTimeout(function() { - //this kinda sucks, but if you don't do a setTimeout, - //the function is called before the text is really pasted. - updatePastedText(thisNote); - }, 10); + // clear up unwanted tag info when user pasted in text + const thisNote = this; + const updatePastedText = function(object) { + const someNote = getSummernote(object); + // Fix Pasting text into a card is adding a line before and after + // (and multiplies by pasting more) by changing paste "p" to "br". + // Fixes https://github.com/wekan/wekan/2890 . + // == Fix Start == + someNote.execCommand('defaultParagraphSeparator', false, 'br'); + // == Fix End == + const original = someNote.summernote('code'); + const cleaned = cleanPastedHTML(original); //this is where to call whatever clean function you want. I have mine in a different file, called CleanPastedHTML. + someNote.summernote('code', ''); //clear original + someNote.summernote('pasteHTML', cleaned); //this sets the displayed content editor to the cleaned pasted code. + }; + setTimeout(function() { + //this kinda sucks, but if you don't do a setTimeout, + //the function is called before the text is really pasted. + updatePastedText(thisNote); + }, 10); + }, }, - }, - dialogsInBody: true, - spellCheck: true, - disableGrammar: false, - disableDragAndDrop: false, - toolbar, - popover: { - image: [ - ['imagesize', ['imageSize100', 'imageSize50', 'imageSize25']], - ['float', ['floatLeft', 'floatRight', 'floatNone']], - ['remove', ['removeMedia']], - ], - link: [['link', ['linkDialogShow', 'unlink']]], - table: [ - ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], - ['delete', ['deleteRow', 'deleteCol', 'deleteTable']], - ], - air: [ - ['color', ['color']], - ['font', ['bold', 'underline', 'clear']], - ], - }, - height: 200, + dialogsInBody: true, + spellCheck: true, + disableGrammar: false, + disableDragAndDrop: false, + toolbar, + popover: { + image: [ + ['imagesize', ['imageSize100', 'imageSize50', 'imageSize25']], + ['float', ['floatLeft', 'floatRight', 'floatNone']], + ['remove', ['removeMedia']], + ], + link: [['link', ['linkDialogShow', 'unlink']]], + table: [ + ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], + ['delete', ['deleteRow', 'deleteCol', 'deleteTable']], + ], + air: [ + ['color', ['color']], + ['font', ['bold', 'underline', 'clear']], + ], + }, + height: 200, + }); }); - }); + } + } else { + enableTextarea(); } - } else { - enableTextarea(); + }, + events() { + return [ + { + 'click a.fa.fa-copy'(event) { + const $editor = this.$('textarea.editor'); + const promise = Utils.copyTextToClipboard($editor[0].value); + + const $tooltip = this.$('.copied-tooltip'); + Utils.showCopied(promise, $tooltip); + }, + } + ] } -}); +}).register('editor'); import DOMPurify from 'dompurify'; diff --git a/client/components/main/editor.styl b/client/components/main/editor.styl new file mode 100644 index 000000000..07e1c627f --- /dev/null +++ b/client/components/main/editor.styl @@ -0,0 +1,7 @@ +.new-comment, +.inlined-form + a.fa.fa-copy + float: right + position: relative + top: 20px + right: 6px diff --git a/client/components/main/header.jade b/client/components/main/header.jade index 05af9aded..85cb64ef4 100644 --- a/client/components/main/header.jade +++ b/client/components/main/header.jade @@ -16,12 +16,14 @@ template(name="header") each currentBoard.lists li(class="{{#if $.Session.equals 'currentList' _id}}current{{/if}}") a.js-select-list - = title + +viewer + = title else each currentUser.starredBoards li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}") a(href="{{pathFor 'board' id=_id slug=slug}}") - = title + +viewer + = title #header-new-board-icon else //- @@ -36,7 +38,8 @@ template(name="header") unless currentSetting.customTopLeftCornerLogoLinkUrl img(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" height="{{#if currentSetting.customTopLeftCornerLogoHeight}}#{currentSetting.customTopLeftCornerLogoHeight}{{else}}27{{/if}}" width="auto" margin="0" padding="0" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}") unless currentSetting.customTopLeftCornerLogoImageUrl - img(src="{{pathFor '/logo-header.png'}}" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}") + div#headerIsSettingDatabaseCallDone + img(src="{{pathFor '/logo-header.png'}}" alt="{{currentSetting.productName}}" title="{{currentSetting.productName}}") span.allBoards a(href="{{pathFor 'home'}}") span.fa.fa-home @@ -49,7 +52,8 @@ template(name="header") each currentUser.starredBoards li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}") a(href="{{pathFor 'board' id=_id slug=slug}}") - = title + +viewer + = title else li.current.empty {{_ 'quick-access-description'}} @@ -90,3 +94,5 @@ template(name="offlineWarning") p i.fa.fa-warning | {{_ 'app-is-offline'}} + + a.app-try-reconnect {{_ 'app-try-reconnect'}} diff --git a/client/components/main/header.js b/client/components/main/header.js index 957a12854..7e3f0166d 100644 --- a/client/components/main/header.js +++ b/client/components/main/header.js @@ -1,7 +1,23 @@ Meteor.subscribe('user-admin'); Meteor.subscribe('boards'); Meteor.subscribe('setting'); +Template.header.onCreated(function(){ + const templateInstance = this; + templateInstance.currentSetting = new ReactiveVar(); + templateInstance.isLoading = new ReactiveVar(false); + Meteor.subscribe('setting', { + onReady() { + templateInstance.currentSetting.set(Settings.findOne()); + let currSetting = templateInstance.currentSetting.curValue; + if(currSetting && currSetting !== undefined && currSetting.customLoginLogoImageUrl !== undefined && document.getElementById("headerIsSettingDatabaseCallDone") != null) + document.getElementById("headerIsSettingDatabaseCallDone").style.display = 'none'; + else if(document.getElementById("headerIsSettingDatabaseCallDone") != null) + document.getElementById("headerIsSettingDatabaseCallDone").style.display = 'block'; + return this.stop(); + }, + }); +}); Template.header.helpers({ wrappedHeader() { return !Session.get('currentBoard'); @@ -41,3 +57,10 @@ Template.header.events({ Session.set('currentCard', null); }, }); + +Template.offlineWarning.events({ + 'click a.app-try-reconnect'(event) { + event.preventDefault(); + Meteor.reconnect(); + }, +}); diff --git a/client/components/main/header.styl b/client/components/main/header.styl index f396d69a7..eaca2d765 100644 --- a/client/components/main/header.styl +++ b/client/components/main/header.styl @@ -135,6 +135,14 @@ padding: 12px 10px margin: -10px 0px + .viewer + display: inline + white-space: nowrap + + p + display: inline + white-space: nowrap + &.current color: darken(white, 5%) @@ -242,3 +250,6 @@ p margin: 7px padding: 0 + +#headerIsSettingDatabaseCallDone + display: none; diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade index 3c87104f4..fcdd8aa4f 100644 --- a/client/components/main/layouts.jade +++ b/client/components/main/layouts.jade @@ -34,8 +34,9 @@ template(name="userFormsLayout") img(src="{{currentSetting.customLoginLogoImageUrl}}" width="300" height="auto") br unless currentSetting.customLoginLogoImageUrl - img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto") - br + div#isSettingDatabaseCallDone + img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto") + br if currentSetting.textBelowCustomLoginLogo +viewer | {{currentSetting.textBelowCustomLoginLogo}} @@ -47,6 +48,13 @@ template(name="userFormsLayout") +Template.dynamic(template=content) if currentSetting.displayAuthenticationMethod +connectionMethod(authenticationMethod=currentSetting.defaultAuthenticationMethod) + if isLegalNoticeLinkExist + div#legalNoticeDiv + span#legalNoticeSpan {{_ 'acceptance_of_our_legalNotice'}} + a#legalNoticeAtLink.at-link(href="{{currentSetting.legalNotice}}", target="_blank", rel="noopener noreferrer") + | {{_ 'legalNotice'}} + if getLegalNoticeWithWritTraduction + div div.at-form-lang select.select-lang.js-userform-set-language each languages diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js index bf290bd5a..8a93cf047 100644 --- a/client/components/main/layouts.js +++ b/client/components/main/layouts.js @@ -6,6 +6,9 @@ const i18nTagToT9n = i18nTag => { return i18nTag; }; +let alreadyCheck = 1; +let isCheckDone = false; + const validator = { set(obj, prop, value) { if (prop === 'state' && value !== 'signIn') { @@ -20,6 +23,8 @@ const validator = { }, }; +// let isSettingDatabaseFctCallDone = false; + Template.userFormsLayout.onCreated(function() { const templateInstance = this; templateInstance.currentSetting = new ReactiveVar(); @@ -28,6 +33,18 @@ Template.userFormsLayout.onCreated(function() { Meteor.subscribe('setting', { onReady() { templateInstance.currentSetting.set(Settings.findOne()); + let currSetting = templateInstance.currentSetting.curValue; + let oidcBtnElt = $("#at-oidc"); + if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){ + let htmlvalue = "" + currSetting.oidcBtnText; + oidcBtnElt.html(htmlvalue); + } + + // isSettingDatabaseFctCallDone = true; + if(currSetting && currSetting !== undefined && currSetting.customLoginLogoImageUrl !== undefined) + document.getElementById("isSettingDatabaseCallDone").style.display = 'none'; + else + document.getElementById("isSettingDatabaseCallDone").style.display = 'block'; return this.stop(); }, }); @@ -56,6 +73,31 @@ Template.userFormsLayout.helpers({ return Template.instance().currentSetting.get(); }, + // isSettingDatabaseCallDone(){ + // return isSettingDatabaseFctCallDone; + // }, + + isLegalNoticeLinkExist(){ + const currSet = Template.instance().currentSetting.get(); + if(currSet && currSet !== undefined && currSet != null){ + return currSet.legalNotice !== undefined && currSet.legalNotice.trim() != ""; + } + else + return false; + }, + + getLegalNoticeWithWritTraduction(){ + let spanLegalNoticeElt = $("#legalNoticeSpan"); + if(spanLegalNoticeElt != null && spanLegalNoticeElt != undefined){ + spanLegalNoticeElt.html(TAPi18n.__('acceptance_of_our_legalNotice', {}, T9n.getLanguage() || 'en')); + } + let atLinkLegalNoticeElt = $("#legalNoticeAtLink"); + if(atLinkLegalNoticeElt != null && atLinkLegalNoticeElt != undefined){ + atLinkLegalNoticeElt.html(TAPi18n.__('legalNotice', {}, T9n.getLanguage() || 'en')); + } + return true; + }, + isLoading() { return Template.instance().isLoading.get(); }, @@ -79,6 +121,10 @@ Template.userFormsLayout.helpers({ name = 'مَصرى'; } else if (lang.name === 'de-CH') { name = 'Deutsch (Schweiz)'; + } else if (lang.name === 'de-AT') { + name = 'Deutsch (Österreich)'; + } else if (lang.name === 'en-DE') { + name = 'English (Germany)'; } else if (lang.name === 'fa-IR') { // fa-IR = Persian (Iran) name = 'فارسی/پارسی (ایران‎)'; @@ -86,14 +132,28 @@ Template.userFormsLayout.helpers({ name = 'Français (Belgique)'; } else if (lang.name === 'fr-CA') { name = 'Français (Canada)'; + } else if (lang.name === 'fr-CH') { + name = 'Français (Schweiz)'; + } else if (lang.name === 'gu-IN') { + // gu-IN = Gurajati (India) + name = 'ગુજરાતી'; + } else if (lang.name === 'hi-IN') { + // hi-IN = Hindi (India) + name = 'हिंदी (भारत)'; } else if (lang.name === 'ig') { name = 'Igbo'; } else if (lang.name === 'lv') { name = 'Latviešu'; } else if (lang.name === 'latviešu valoda') { name = 'Latviešu'; + } else if (lang.name === 'ms-MY') { + // ms-MY = Malay (Malaysia) + name = 'بهاس ملايو'; } else if (lang.name === 'en-IT') { name = 'English (Italy)'; + } else if (lang.name === 'el-GR') { + // el-GR = Greek (Greece) + name = 'Ελληνικά (Ελλάδα)'; } else if (lang.name === 'Español') { name = 'español'; } else if (lang.name === 'es_419') { @@ -125,6 +185,7 @@ Template.userFormsLayout.helpers({ } else if (lang.name === 'st') { name = 'Sãotomense'; } else if (lang.name === '繁体中文(台湾)') { + // Traditional Chinese (Taiwan) name = '繁體中文(台灣)'; } return { tag, name }; @@ -157,6 +218,53 @@ Template.userFormsLayout.events({ templateInstance.isLoading.set(false); }); } + isCheckDone = false; + }, + 'click #at-signUp'(event, templateInstance){ + isCheckDone = false; + }, + 'DOMSubtreeModified #at-oidc'(event){ + if(alreadyCheck <= 2){ + let currSetting = Settings.findOne(); + let oidcBtnElt = $("#at-oidc"); + if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){ + let htmlvalue = "" + currSetting.oidcBtnText; + if(alreadyCheck == 1){ + alreadyCheck++; + oidcBtnElt.html(""); + } + else{ + alreadyCheck++; + oidcBtnElt.html(htmlvalue); + } + } + } + else{ + alreadyCheck = 1; + } + }, + 'DOMSubtreeModified .at-form'(event){ + if(alreadyCheck <= 2 && !isCheckDone){ + if(document.getElementById("at-oidc") != null){ + let currSetting = Settings.findOne(); + let oidcBtnElt = $("#at-oidc"); + if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){ + let htmlvalue = "" + currSetting.oidcBtnText; + if(alreadyCheck == 1){ + alreadyCheck++; + oidcBtnElt.html(""); + } + else{ + alreadyCheck++; + isCheckDone = true; + oidcBtnElt.html(htmlvalue); + } + } + } + } + else{ + alreadyCheck = 1; + } }, }); diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 5896bbb2e..b265ff9c1 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -433,7 +433,7 @@ a margin-top: 0px .wrapper - height: 100% + height: calc(100% - 31px) margin: 0px .panel-default @@ -542,3 +542,11 @@ a 100% transform: rotate(360deg) + +#isSettingDatabaseCallDone + display: none; + +.at-link + color: #17683a; + text-decoration: underline; + text-decoration-color: #17683a; diff --git a/client/components/main/popup.styl b/client/components/main/popup.styl index 91f5fa039..24a864722 100644 --- a/client/components/main/popup.styl +++ b/client/components/main/popup.styl @@ -14,8 +14,7 @@ $popupWidth = 300px margin-top: 5px hr - margin: 4px -10px - width: $popupWidth + margin: 4px 0px p, textarea, @@ -23,7 +22,6 @@ $popupWidth = 300px input[type="email"], input[type="password"], input[type="file"] - margin: 4px 0 12px width: 100% select @@ -313,22 +311,13 @@ $popupWidth = 300px input[type="email"], input[type="password"], input[type="file"] - margin: 4px 0 12px width: 100% box-sizing: border-box .pop-over-list li > a width: calc(100% - 20px) - padding: 10px 10px margin: 0px 0px - border-bottom: 1px solid #eee - - hr - width: 100% - height: 20px - margin: 0px 0px - color: #eee for depth in (1..6) .popup-container-depth-{depth} diff --git a/client/components/rules/actions/cardActions.js b/client/components/rules/actions/cardActions.js index 2290249ca..e319d7b7c 100644 --- a/client/components/rules/actions/cardActions.js +++ b/client/components/rules/actions/cardActions.js @@ -232,7 +232,7 @@ BlazeComponent.extendComponent({ }, 'click .js-submit'() { this.colorButtonValue.set(this.currentColor.get()); - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/rules/triggers/boardTriggers.js b/client/components/rules/triggers/boardTriggers.js index 66ee337ac..77e0c620e 100644 --- a/client/components/rules/triggers/boardTriggers.js +++ b/client/components/rules/triggers/boardTriggers.js @@ -116,6 +116,6 @@ Template.boardCardTitlePopup.events({ .trim(); Popup.getOpenerComponent().setNameFilter(title); event.preventDefault(); - Popup.close(); + Popup.back(); }, }); diff --git a/client/components/settings/informationBody.jade b/client/components/settings/informationBody.jade index 0f85dd9c9..e98fe1e68 100644 --- a/client/components/settings/informationBody.jade +++ b/client/components/settings/informationBody.jade @@ -21,7 +21,7 @@ template(name='statistics') table tbody tr - th Wekan {{_ 'info'}} + th WeKan ® {{_ 'info'}} td {{statistics.version}} tr th {{_ 'Meteor_version'}} @@ -65,3 +65,49 @@ template(name='statistics') tr th {{_ 'OS_Cpus'}} td {{statistics.os.cpus.length}} + unless isSandstorm + tr + th {{_ 'Node_heap_total_heap_size'}} + td {{bytesToSize statistics.nodeHeapStats.totalHeapSize}} + tr + th {{_ 'Node_heap_total_heap_size_executable'}} + td {{bytesToSize statistics.nodeHeapStats.totalHeapSizeExecutable}} + tr + th {{_ 'Node_heap_total_physical_size'}} + td {{bytesToSize statistics.nodeHeapStats.totalPhysicalSize}} + tr + th {{_ 'Node_heap_total_available_size'}} + td {{bytesToSize statistics.nodeHeapStats.totalAvailableSize}} + tr + th {{_ 'Node_heap_used_heap_size'}} + td {{bytesToSize statistics.nodeHeapStats.usedHeapSize}} + tr + th {{_ 'Node_heap_heap_size_limit'}} + td {{bytesToSize statistics.nodeHeapStats.heapSizeLimit}} + tr + th {{_ 'Node_heap_malloced_memory'}} + td {{bytesToSize statistics.nodeHeapStats.mallocedMemory}} + tr + th {{_ 'Node_heap_peak_malloced_memory'}} + td {{bytesToSize statistics.nodeHeapStats.peakMallocedMemory}} + tr + th {{_ 'Node_heap_does_zap_garbage'}} + td {{statistics.nodeHeapStats.doesZapGarbage}} + tr + th {{_ 'Node_heap_number_of_native_contexts'}} + td {{statistics.nodeHeapStats.numberOfNativeContexts}} + tr + th {{_ 'Node_heap_number_of_detached_contexts'}} + td {{statistics.nodeHeapStats.numberOfDetachedContexts}} + tr + th {{_ 'Node_memory_usage_rss'}} + td {{bytesToSize statistics.nodeMemoryUsage.rss}} + tr + th {{_ 'Node_memory_usage_heap_total'}} + td {{bytesToSize statistics.nodeMemoryUsage.heapTotal}} + tr + th {{_ 'Node_memory_usage_heap_used'}} + td {{bytesToSize statistics.nodeMemoryUsage.heapUsed}} + tr + th {{_ 'Node_memory_usage_external'}} + td {{bytesToSize statistics.nodeMemoryUsage.external}} diff --git a/client/components/settings/peopleBody.jade b/client/components/settings/peopleBody.jade index 09e850071..f0b6da965 100644 --- a/client/components/settings/peopleBody.jade +++ b/client/components/settings/peopleBody.jade @@ -40,6 +40,11 @@ template(name="people") | {{_ 'search'}} .ext-box-right span {{#unless isMiniScreen}}{{_ 'people-number'}}{{/unless}} #{peopleNumber} + .divAddOrRemoveTeam#divAddOrRemoveTeam + button#addOrRemoveTeam + i.fa.fa-edit + | {{_ 'add'}} / {{_ 'delete'}} {{_ 'teams'}} + .content-body .side-menu ul @@ -97,9 +102,13 @@ template(name="teamGeneral") +teamRow(teamId=team._id) template(name="peopleGeneral") + #divAddOrRemoveTeamContainer + +modifyTeamsUsers table tbody tr + th + +selectAllUser th {{_ 'username'}} th {{_ 'fullname'}} th {{_ 'initials'}} @@ -117,6 +126,10 @@ template(name="peopleGeneral") each user in peopleList +peopleRow(userId=user._id) +template(name="selectAllUser") + | {{_ 'dueCardsViewChange-choice-all'}} + input.allUserChkBox(type="checkbox", id="chkSelectAll") + template(name="newOrgRow") a.new-org i.fa.fa-plus-square @@ -202,6 +215,12 @@ template(name="teamRow") template(name="peopleRow") tr + if userData.loginDisabled + td + input.selectUserChkBox(type="checkbox", disabled="disabled", id="{{userData._id}}") + else + td + input.selectUserChkBox(type="checkbox", id="{{userData._id}}") if userData.loginDisabled td.username {{ userData.username }} else @@ -342,7 +361,7 @@ template(name="editUserPopup") input.js-profile-fullname(type="text" value=user.profile.fullname required) label | {{_ 'initials'}} - input.js-profile-initials(type="text" value=user.profile.initials required) + input.js-profile-initials(type="text" value=user.profile.initials) label | {{_ 'admin'}} select.select-role.js-profile-isadmin @@ -453,6 +472,24 @@ template(name="newTeamPopup") div.buttonsContainer input.primary.wide(type="submit" value="{{_ 'save'}}") +template(name="modifyTeamsUsers") + label + | {{_ 'teams'}} + select.js-teamsUser#jsteamsUser + each value in teamsDatas + option(value="{{value._id}}") {{_ value.teamDisplayName}} + hr + label + | {{_ 'r-action'}} + .form-group.flex + input.wekan-form-control#addAction(type="radio" name="action" value="true" checked="checked") + span {{_ 'add'}} + input.wekan-form-control#deleteAction(type="radio" name="action" value="false") + span {{_ 'delete'}} + div.buttonsContainer + input.primary.wide#addTeamBtn(type="submit" value="{{_ 'save'}}") + input.primary.wide#cancelBtn(type="submit" value="{{_ 'cancel'}}") + template(name="newUserPopup") form //label.hide.userId(type="text" value=user._id) @@ -469,7 +506,7 @@ template(name="newUserPopup") input.js-profile-username(type="text" value="" required) label | {{_ 'initials'}} - input.js-profile-initials(type="text" value="" required) + input.js-profile-initials(type="text" value="") label | {{_ 'email'}} span.error.hide.email-taken @@ -571,10 +608,14 @@ template(name="settingsUserPopup") a.impersonate-user i.fa.fa-user | {{_ 'impersonate-user'}} + br hr li form label.hide.userId(type="text" value=user._id) + label + | {{_ 'delete-user-confirm-popup' }} + br div.buttonsContainer input#deleteButton.card-details-red.right.wide(type="button" value="{{_ 'delete'}}") // Delete is enabled, but there is still bug of leaving empty user avatars diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index ab6d1fbd2..8327668ad 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -2,6 +2,7 @@ const orgsPerPage = 25; const teamsPerPage = 25; const usersPerPage = 25; let userOrgsTeamsAction = ""; //poosible actions 'addOrg', 'addTeam', 'removeOrg' or 'removeTeam' when adding or modifying a user +let selectedUserChkBoxUserIds = []; BlazeComponent.extendComponent({ mixins() { @@ -81,6 +82,9 @@ BlazeComponent.extendComponent({ 'click #searchButton'() { this.filterPeople(); }, + 'click #addOrRemoveTeam'(){ + document.getElementById("divAddOrRemoveTeamContainer").style.display = 'block'; + }, 'keydown #searchInput'(event) { if (event.keyCode === 13 && !event.shiftKey) { this.filterPeople(); @@ -140,6 +144,7 @@ BlazeComponent.extendComponent({ }, orgList() { const orgs = Org.find(this.findOrgsOptions.get(), { + sort: { orgDisplayName: 1 }, fields: { _id: true }, }); this.numberOrgs.set(orgs.count(false)); @@ -147,6 +152,7 @@ BlazeComponent.extendComponent({ }, teamList() { const teams = Team.find(this.findTeamsOptions.get(), { + sort: { teamDisplayName: 1 }, fields: { _id: true }, }); this.numberTeams.set(teams.count(false)); @@ -154,6 +160,7 @@ BlazeComponent.extendComponent({ }, peopleList() { const users = Users.find(this.findUsersOptions.get(), { + sort: { username: 1 }, fields: { _id: true }, }); this.numberPeople.set(users.count(false)); @@ -247,10 +254,10 @@ Template.editUserPopup.helpers({ return Template.instance().authenticationMethods.get(); }, orgsDatas() { - return Org.find({}, {sort: { createdAt: -1 }}); + return Org.find({}, {sort: { orgDisplayName: 1 }}); }, teamsDatas() { - return Team.find({}, {sort: { createdAt: -1 }}); + return Team.find({}, {sort: { teamDisplayName: 1 }}); }, isSelected(match) { const userId = Template.instance().data.userId; @@ -320,10 +327,10 @@ Template.newUserPopup.helpers({ return Template.instance().authenticationMethods.get(); }, orgsDatas() { - return Org.find({}, {sort: { createdAt: -1 }}); + return Org.find({}, {sort: { orgDisplayName: 1 }}); }, teamsDatas() { - return Team.find({}, {sort: { createdAt: -1 }}); + return Team.find({}, {sort: { teamDisplayName: 1 }}); }, isSelected(match) { const userId = Template.instance().data.userId; @@ -385,11 +392,111 @@ BlazeComponent.extendComponent({ { 'click a.edit-user': Popup.open('editUser'), 'click a.more-settings-user': Popup.open('settingsUser'), + 'click .selectUserChkBox': function(ev){ + if(ev.currentTarget){ + if(ev.currentTarget.checked){ + if(!selectedUserChkBoxUserIds.includes(ev.currentTarget.id)){ + selectedUserChkBoxUserIds.push(ev.currentTarget.id); + } + } + else{ + if(selectedUserChkBoxUserIds.includes(ev.currentTarget.id)){ + let index = selectedUserChkBoxUserIds.indexOf(ev.currentTarget.id); + if(index > -1) + selectedUserChkBoxUserIds.splice(index, 1); + } + } + } + if(selectedUserChkBoxUserIds.length > 0) + document.getElementById("divAddOrRemoveTeam").style.display = 'block'; + else + document.getElementById("divAddOrRemoveTeam").style.display = 'none'; + }, }, ]; }, }).register('peopleRow'); +BlazeComponent.extendComponent({ + onCreated() {}, + teamsDatas() { + return Team.find({}, {sort: { teamDisplayName: 1 }}); + }, + events() { + return [ + { + 'click #cancelBtn': function(){ + let selectedElt = document.getElementById("jsteamsUser"); + document.getElementById("divAddOrRemoveTeamContainer").style.display = 'none'; + }, + 'click #addTeamBtn': function(){ + let selectedElt; + let selectedEltValue; + let selectedEltValueId; + let userTms = []; + let currentUser; + let currUserTeamIndex; + + selectedElt = document.getElementById("jsteamsUser"); + selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text; + selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value; + + if(document.getElementById('addAction').checked){ + for(let i = 0; i < selectedUserChkBoxUserIds.length; i++){ + currentUser = Users.findOne(selectedUserChkBoxUserIds[i]); + userTms = currentUser.teams; + if(userTms == undefined || userTms.length == 0){ + userTms = []; + userTms.push({ + "teamId": selectedEltValueId, + "teamDisplayName": selectedEltValue, + }) + } + else if(userTms.length > 0) + { + currUserTeamIndex = userTms.findIndex(function(t){ return t.teamId == selectedEltValueId}); + if(currUserTeamIndex == -1){ + userTms.push({ + "teamId": selectedEltValueId, + "teamDisplayName": selectedEltValue, + }); + } + } + + Users.update(selectedUserChkBoxUserIds[i], { + $set:{ + teams: userTms + } + }); + } + } + else{ + for(let i = 0; i < selectedUserChkBoxUserIds.length; i++){ + currentUser = Users.findOne(selectedUserChkBoxUserIds[i]); + userTms = currentUser.teams; + if(userTms !== undefined || userTms.length > 0) + { + currUserTeamIndex = userTms.findIndex(function(t){ return t.teamId == selectedEltValueId}); + if(currUserTeamIndex != -1){ + userTms.splice(currUserTeamIndex, 1); + } + } + + Users.update(selectedUserChkBoxUserIds[i], { + $set:{ + teams: userTms + } + }); + } + } + + document.getElementById("divAddOrRemoveTeamContainer").style.display = 'none'; + }, + }, + ]; + }, +}).register('modifyTeamsUsers'); + BlazeComponent.extendComponent({ events() { return [ @@ -420,6 +527,41 @@ BlazeComponent.extendComponent({ }, }).register('newUserRow'); +BlazeComponent.extendComponent({ + events() { + return [ + { + 'click .allUserChkBox': function(ev){ + selectedUserChkBoxUserIds = []; + const checkboxes = document.getElementsByClassName("selectUserChkBox"); + if(ev.currentTarget){ + if(ev.currentTarget.checked){ + for (let i=0; i 0) + document.getElementById("divAddOrRemoveTeam").style.display = 'block'; + else + document.getElementById("divAddOrRemoveTeam").style.display = 'none'; + }, + }, + ]; + }, +}).register('selectAllUser'); + Template.editOrgPopup.events({ submit(event, templateInstance) { event.preventDefault(); @@ -431,8 +573,7 @@ Template.editOrgPopup.events({ const orgDesc = templateInstance.find('.js-orgDesc').value.trim(); const orgShortName = templateInstance.find('.js-orgShortName').value.trim(); const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim(); - const orgIsActive = - templateInstance.find('.js-org-isactive').value.trim() == 'true'; + const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true'; const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName; const isChangeOrgDesc = orgDesc !== org.orgDesc; @@ -458,7 +599,7 @@ Template.editOrgPopup.events({ ); } - Popup.close(); + Popup.back(); }, }); @@ -502,7 +643,7 @@ Template.editTeamPopup.events({ ); } - Popup.close(); + Popup.back(); }, }); @@ -617,7 +758,7 @@ Template.editUserPopup.events({ } else { usernameMessageElement.hide(); emailMessageElement.hide(); - Popup.close(); + Popup.back(); } }, ); @@ -631,7 +772,7 @@ Template.editUserPopup.events({ } } else { usernameMessageElement.hide(); - Popup.close(); + Popup.back(); } }); } else if (isChangeEmail) { @@ -648,11 +789,11 @@ Template.editUserPopup.events({ } } else { emailMessageElement.hide(); - Popup.close(); + Popup.back(); } }, ); - } else Popup.close(); + } else Popup.back(); }, 'click #addUserOrg'(event) { event.preventDefault(); @@ -787,7 +928,7 @@ Template.newOrgPopup.events({ orgWebsite, orgIsActive, ); - Popup.close(); + Popup.back(); }, }); @@ -813,7 +954,7 @@ Template.newTeamPopup.events({ teamWebsite, teamIsActive, ); - Popup.close(); + Popup.back(); }, }); @@ -839,20 +980,24 @@ Template.newUserPopup.events({ let userTeamsIdsList = userTeamsIds.split(","); let userTms = []; for(let i = 0; i < userTeamsList.length; i++){ - userTms.push({ - "teamId": userTeamsIdsList[i], - "teamDisplayName": userTeamsList[i], - }) + if(!!userTeamsIdsList[i] && !!userTeamsList[i]) { + userTms.push({ + "teamId": userTeamsIdsList[i], + "teamDisplayName": userTeamsList[i], + }) + } } let userOrgsList = userOrgs.split(","); let userOrgsIdsList = userOrgsIds.split(","); let userOrganizations = []; for(let i = 0; i < userOrgsList.length; i++){ - userOrganizations.push({ - "orgId": userOrgsIdsList[i], - "orgDisplayName": userOrgsList[i], - }) + if(!!userOrgsIdsList[i] && !!userOrgsList[i]) { + userOrganizations.push({ + "orgId": userOrgsIdsList[i], + "orgDisplayName": userOrgsList[i], + }) + } } Meteor.call( @@ -882,11 +1027,11 @@ Template.newUserPopup.events({ } else { usernameMessageElement.hide(); emailMessageElement.hide(); - Popup.close(); + Popup.back(); } }, ); - Popup.close(); + Popup.back(); }, 'click #addUserOrgNewUser'(event) { event.preventDefault(); @@ -940,7 +1085,7 @@ Template.settingsOrgPopup.events({ return; } Org.remove(this.orgId); - Popup.close(); + Popup.back(); } }); @@ -958,7 +1103,7 @@ Template.settingsTeamPopup.events({ return; } Team.remove(this.teamId); - Popup.close(); + Popup.back(); } }); @@ -975,10 +1120,13 @@ Template.settingsUserPopup.events({ }, 'click #deleteButton'(event) { event.preventDefault(); + Users.remove(this.userId); /* - // Delete is not enabled yet, because it does leave empty user avatars - // to boards: boards members, card members and assignees have - // empty users. See: + // Delete user is enabled, but you should remove user from all boards + // before deleting user, because there is possibility of leaving empty user avatars + // to boards. You can remove non-existing user ids manually from database, + // if that happens. + //. See: // - wekan/client/components/settings/peopleBody.jade deleteButton // - wekan/client/components/settings/peopleBody.js deleteButton // - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember' @@ -986,9 +1134,9 @@ Template.settingsUserPopup.events({ // but that should be used to remove user from all boards similarly // - wekan/models/users.js Delete is not enabled // - //Users.remove(this.userId); + // */ - Popup.close(); + Popup.back(); }, }); diff --git a/client/components/settings/peopleBody.styl b/client/components/settings/peopleBody.styl index 8ef33c9e0..9ab1c1f4b 100644 --- a/client/components/settings/peopleBody.styl +++ b/client/components/settings/peopleBody.styl @@ -55,3 +55,32 @@ table .js-teams,.js-teamsNewUser display: none; + +.selectUserChkBox,.allUserChkBox + position: static !important; + visibility: visible !important; + left: 0 !important; + display: block !important; + +#divAddOrRemoveTeam + background: green; + display: none; + +#addOrRemoveTeam + background: green; + color: white; + +#divAddOrRemoveTeamContainer + display: none; + margin: auto; + width: 50%; + border: 3px solid green; + padding: 10px; + +#cancelBtn + margin-left: 5% !important; + background: orange; + color: white; + +#deleteAction + margin-left: 5% !important; diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index 76f8ae95c..775891eea 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -22,6 +22,10 @@ template(name="setting") a.js-setting-menu(data-id="account-setting") i.fa.fa-users | {{_ 'accounts'}} + li + a.js-setting-menu(data-id="tableVisibilityMode-setting") + i.fa.fa-eye + | {{_ 'tableVisibilityMode'}} li a.js-setting-menu(data-id="announcement-setting") i.fa.fa-bullhorn @@ -44,6 +48,8 @@ template(name="setting") +email else if accountSetting.get +accountSettings + else if tableVisibilityModeSetting.get + +tableVisibilityModeSettings else if announcementSetting.get +announcementSettings else if layoutSetting.get @@ -96,7 +102,7 @@ template(name='email') // li.smtp-form // .title {{_ 'smtp-username'}} // .form-group - // input.wekan-form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}") + // input.wekan-form-control#mail-server-u"accounts-allowUserNameChange": "Allow Username Change",sername(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}") // li.smtp-form // .title {{_ 'smtp-password'}} // .form-group @@ -120,6 +126,17 @@ template(name='email') li button.js-send-smtp-test-email.primary {{_ 'send-smtp-test'}} +template(name='tableVisibilityModeSettings') + ul#tableVisibilityMode-setting.setting-detail + li.tableVisibilityMode-form + .title {{_ 'tableVisibilityMode-allowPrivateOnly'}} + .form-group.flex + input.wekan-form-control#accounts-allowPrivateOnly(type="radio" name="allowPrivateOnly" value="true" checked="{{#if allowPrivateOnly}}checked{{/if}}") + span {{_ 'yes'}} + input.wekan-form-control#accounts-allowPrivateOnly(type="radio" name="allowPrivateOnly" value="false" checked="{{#unless allowPrivateOnly}}checked{{/unless}}") + span {{_ 'no'}} + button.js-tableVisibilityMode-save.primary {{_ 'save'}} + template(name='accountSettings') ul#account-setting.setting-detail li @@ -163,6 +180,18 @@ template(name='announcementSettings') template(name='layoutSettings') ul#layout-setting.setting-detail + li.layout-form + .title {{_ 'oidc-button-text'}} + .form-group + input.wekan-form-control#oidcBtnTextvalue(type="text", placeholder="" value="{{currentSetting.oidcBtnText}}") + li.layout-form + .title {{_ 'can-invite-if-same-mailDomainName'}} + .form-group + input.wekan-form-control#mailDomainNamevalue(type="text", placeholder="" value="{{currentSetting.mailDomainName}}") + li.layout-form + .title {{_ 'custom-legal-notice-link-url'}} + .form-group + input.wekan-form-control#legalNoticevalue(type="text", placeholder="" value="{{currentSetting.legalNotice}}") li.layout-form .title {{_ 'display-authentication-method'}} .form-group.flex diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index e55e2db6b..71a286fdb 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -7,6 +7,7 @@ BlazeComponent.extendComponent({ this.generalSetting = new ReactiveVar(true); this.emailSetting = new ReactiveVar(false); this.accountSetting = new ReactiveVar(false); + this.tableVisibilityModeSetting = new ReactiveVar(false); this.announcementSetting = new ReactiveVar(false); this.layoutSetting = new ReactiveVar(false); this.webhookSetting = new ReactiveVar(false); @@ -14,6 +15,7 @@ BlazeComponent.extendComponent({ Meteor.subscribe('setting'); Meteor.subscribe('mailServer'); Meteor.subscribe('accountSettings'); + Meteor.subscribe('tableVisibilityModeSettings'); Meteor.subscribe('announcements'); Meteor.subscribe('globalwebhooks'); }, @@ -88,6 +90,7 @@ BlazeComponent.extendComponent({ this.announcementSetting.set('announcement-setting' === targetID); this.layoutSetting.set('layout-setting' === targetID); this.webhookSetting.set('webhook-setting' === targetID); + this.tableVisibilityModeSetting.set('tableVisibilityMode-setting' === targetID); } }, @@ -196,6 +199,22 @@ BlazeComponent.extendComponent({ ) .val() .trim(); + + const oidcBtnText = $( + '#oidcBtnTextvalue', + ) + .val() + .trim(); + const mailDomainName = $( + '#mailDomainNamevalue', + ) + .val() + .trim(); + const legalNotice = $( + '#legalNoticevalue', + ) + .val() + .trim(); const hideLogoChange = $('input[name=hideLogo]:checked').val() === 'true'; const displayAuthenticationMethod = $('input[name=displayAuthenticationMethod]:checked').val() === 'true'; @@ -218,6 +237,9 @@ BlazeComponent.extendComponent({ defaultAuthenticationMethod, automaticLinkedUrlSchemes, spinnerName, + oidcBtnText, + mailDomainName, + legalNotice, }, }); } catch (e) { @@ -317,6 +339,46 @@ BlazeComponent.extendComponent({ }, }).register('accountSettings'); +BlazeComponent.extendComponent({ + saveTableVisibilityChange() { + const allowPrivateOnly = + $('input[name=allowPrivateOnly]:checked').val() === 'true'; + TableVisibilityModeSettings.update('tableVisibilityMode-allowPrivateOnly', { + $set: { booleanValue: allowPrivateOnly }, + }); + }, + allowPrivateOnly() { + return TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').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-tableVisibilityMode-save': this.saveTableVisibilityChange, + }, + { + 'click button.js-all-hide-system-messages': this.allHideSystemMessages, + }, + ]; + }, +}).register('tableVisibilityModeSettings'); + BlazeComponent.extendComponent({ onCreated() { this.loading = new ReactiveVar(false); diff --git a/client/components/settings/settingBody.styl b/client/components/settings/settingBody.styl index d6ac32b26..fed061b76 100644 --- a/client/components/settings/settingBody.styl +++ b/client/components/settings/settingBody.styl @@ -11,7 +11,7 @@ color: #727479 background: #dedede width 100% - height 100% + height calc(100% - 80px) position: absolute; .content-title @@ -88,6 +88,8 @@ &.is-checked background #fff + input[type=radio] + margin: 4px .option @extends .flex diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 40b098e0c..9635eb9e8 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -31,26 +31,28 @@ template(name='homeSidebar') +activities(mode="board") template(name="membersWidget") - .board-widget.board-widget-members - h3 - i.fa.fa-users - | {{_ 'organizations'}} + if AtLeastOneOrgWasCreated + .board-widget.board-widget-members + h3 + i.fa.fa-users + | {{_ 'organizations'}} - .board-widget-content - +boardOrgGeneral - .clearfix - br - hr - .board-widget.board-widget-members - h3 - i.fa.fa-users - | {{_ 'teams'}} + .board-widget-content + +boardOrgGeneral + .clearfix + br + hr + if AtLeastOneTeamWasCreated + .board-widget.board-widget-members + h3 + i.fa.fa-users + | {{_ 'teams'}} - .board-widget-content - +boardTeamGeneral - .clearfix - br - hr + .board-widget-content + +boardTeamGeneral + .clearfix + br + hr .board-widget.board-widget-members h3 i.fa.fa-users @@ -89,11 +91,20 @@ template(name="boardOrgGeneral") table tbody tr - th {{_ 'displayName'}} + th + | {{_ 'add-organizations'}} + br + i.addOrganizationsLabel + | {{_ 'to-create-organizations-contact-admin'}} + br + i.addOrganizationsLabel + | {{_ 'add-organizations-label'}} th if currentUser.isBoardAdmin a.member.orgOrTeamMember.add-member.js-manage-board-addOrg(title="{{_ 'add-members'}}") - i.fa.fa-plus + i.addTeamFaPlus.fa.fa-plus + .divaddfaplusminus + | {{_ 'add'}} each org in currentBoard.activeOrgs +boardOrgRow(orgId=org.orgId) @@ -101,11 +112,20 @@ template(name="boardTeamGeneral") table tbody tr - th {{_ 'displayName'}} + th + | {{_ 'add-teams'}} + br + i.addTeamsLabel + | {{_ 'to-create-teams-contact-admin'}} + br + i.addTeamsLabel + | {{_ 'add-teams-label'}} th if currentUser.isBoardAdmin a.member.orgOrTeamMember.add-member.js-manage-board-addTeam(title="{{_ 'add-members'}}") - i.fa.fa-plus + i.addTeamFaPlus.fa.fa-plus + .divaddfaplusminus + | {{_ 'add'}} each currentBoard.activeTeams +boardTeamRow(teamId=this.teamId) @@ -398,7 +418,11 @@ template(name="exportBoard") li a(href="{{exportCsvUrl}}", download="{{exportCsvFilename}}") i.fa.fa-share-alt - | {{_ 'export-board-csv'}} + | {{_ 'export-board-csv'}} , + li + a(href="{{exportScsvUrl}}", download="{{exportCsvFilename}}") + i.fa.fa-share-alt + | {{_ 'export-board-csv'}} ; li a(href="{{exportTsvUrl}}", download="{{exportTsvFilename}}") i.fa.fa-share-alt @@ -470,12 +494,12 @@ template(name="removeBoardOrgPopup") form input.hide#hideOrgId(type="text" value=org._id) label - | {{_ 'leave-board'}} ? + | {{_ 'remove-organization-from-board'}} br hr div.buttonsContainer - input.primary.wide.leaveBoardBtn#leaveBoardBtn(type="submit" value="{{_ 'leave-board'}}") - input.primary.wide.cancelLeaveBoardBtn#cancelLeaveBoardBtn(type="submit" value="{{_ 'Cancel'}}") + input.primary.wide.leaveBoardBtn#leaveBoardBtn(type="submit" value="{{_ 'confirm-btn'}}") + input.primary.wide.cancelLeaveBoardBtn#cancelLeaveBoardBtn(type="submit" value="{{_ 'cancel'}}") template(name="addBoardTeamPopup") select.js-boardTeams#jsBoardTeams @@ -487,12 +511,12 @@ template(name="removeBoardTeamPopup") form input.hide#hideTeamId(type="text" value=team._id) label - | {{_ 'leave-board'}} ? + | {{_ 'remove-team-from-table'}} br hr div.buttonsContainer - input.primary.wide.leaveBoardBtn#leaveBoardTeamBtn(type="submit" value="{{_ 'leave-board'}}") - input.primary.wide.cancelLeaveBoardBtn#cancelLeaveBoardTeamBtn(type="submit" value="{{_ 'Cancel'}}") + input.primary.wide.leaveBoardBtn#leaveBoardTeamBtn(type="submit" value="{{_ 'confirm-btn'}}") + input.primary.wide.cancelLeaveBoardBtn#cancelLeaveBoardTeamBtn(type="submit" value="{{_ 'cancel'}}") template(name="addMemberPopup") .js-search-member diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 11af15db6..c60d906a7 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -183,19 +183,20 @@ Template.memberPopup.helpers({ }, }); + Template.boardMenuPopup.events({ 'click .js-rename-board': Popup.open('boardChangeTitle'), 'click .js-open-rules-view'() { Modal.openWide('rulesMain'); - Popup.close(); + Popup.back(); }, 'click .js-custom-fields'() { Sidebar.setView('customFields'); - Popup.close(); + Popup.back(); }, 'click .js-open-archives'() { Sidebar.setView('archives'); - Popup.close(); + Popup.back(); }, 'click .js-change-board-color': Popup.open('boardChangeColor'), 'click .js-change-language': Popup.open('changeLanguage'), @@ -208,7 +209,7 @@ Template.boardMenuPopup.events({ }), 'click .js-delete-board': Popup.afterConfirm('deleteBoard', function() { const currentBoard = Boards.findOne(Session.get('currentBoard')); - Popup.close(); + Popup.back(); Boards.remove(currentBoard._id); FlowRouter.go('home'); }), @@ -251,7 +252,7 @@ Template.boardMenuPopup.helpers({ Template.memberPopup.events({ 'click .js-filter-member'() { Filter.members.toggle(this.userId); - Popup.close(); + Popup.back(); }, 'click .js-change-role': Popup.open('changePermissions'), 'click .js-remove-member': Popup.afterConfirm('removeMember', function() { @@ -265,12 +266,12 @@ Template.memberPopup.events({ card.unassignAssignee(memberId); }); Boards.findOne(boardId).removeMember(memberId); - Popup.close(); + Popup.back(); }), 'click .js-leave-member': Popup.afterConfirm('leaveBoard', () => { const boardId = Session.get('currentBoard'); Meteor.call('quitBoard', boardId, () => { - Popup.close(); + Popup.back(); FlowRouter.go('home'); }); }), @@ -290,6 +291,42 @@ Template.leaveBoardPopup.helpers({ return Boards.findOne(Session.get('currentBoard')); }, }); +BlazeComponent.extendComponent({ + onCreated() { + this.error = new ReactiveVar(''); + this.loading = new ReactiveVar(false); + this.findOrgsOptions = new ReactiveVar({}); + this.findTeamsOptions = new ReactiveVar({}); + + this.page = new ReactiveVar(1); + this.teamPage = new ReactiveVar(1); + this.autorun(() => { + const limitOrgs = this.page.get() * Number.MAX_SAFE_INTEGER; + this.subscribe('org', this.findOrgsOptions.get(), limitOrgs, () => {}); + }); + + this.autorun(() => { + const limitTeams = this.teamPage.get() * Number.MAX_SAFE_INTEGER; + this.subscribe('team', this.findTeamsOptions.get(), limitTeams, () => {}); + }); + }, + + onRendered() { + this.setLoading(false); + }, + + setError(error) { + this.error.set(error); + }, + + setLoading(w) { + this.loading.set(w); + }, + + isLoading() { + return this.loading.get(); + }, +}).register('membersWidget'); Template.membersWidget.helpers({ isInvited() { @@ -307,6 +344,21 @@ Template.membersWidget.helpers({ isBoardAdmin() { return Meteor.user().isBoardAdmin(); }, + AtLeastOneOrgWasCreated(){ + let orgs = Org.find({}, {sort: { createdAt: -1 }}); + if(orgs === undefined) + return false; + + return orgs.count() > 0; + }, + + AtLeastOneTeamWasCreated(){ + let teams = Team.find({}, {sort: { createdAt: -1 }}); + if(teams === undefined) + return false; + + return teams.count() > 0; + }, }); Template.membersWidget.events({ @@ -408,7 +460,7 @@ BlazeComponent.extendComponent({ activities: ['all'], }); } - Popup.close(); + Popup.back(); }, }, ]; @@ -460,6 +512,21 @@ BlazeComponent.extendComponent({ }; const queryParams = { authToken: Accounts._storedLoginToken(), + delimiter: ',', + }; + return FlowRouter.path( + '/api/boards/:boardId/export/csv', + params, + queryParams, + ); + }, + exportScsvUrl() { + const params = { + boardId: Session.get('currentBoard'), + }; + const queryParams = { + authToken: Accounts._storedLoginToken(), + delimiter: ';', }; return FlowRouter.path( '/api/boards/:boardId/export/csv', @@ -1162,7 +1229,7 @@ BlazeComponent.extendComponent({ self.setLoading(false); if (err) self.setError(err.error); else if (ret.email) self.setError('email-sent'); - else Popup.close(); + else Popup.back(); }); }, @@ -1249,7 +1316,7 @@ BlazeComponent.extendComponent({ } } - Popup.close(); + Popup.back(); }, }, ]; @@ -1258,8 +1325,7 @@ BlazeComponent.extendComponent({ Template.addBoardOrgPopup.helpers({ orgsDatas() { - // return Org.find({}, {sort: { createdAt: -1 }}); - let orgs = Org.find({}, {sort: { createdAt: -1 }}); + let orgs = Org.find({}, {sort: { orgDisplayName: 1 }}); return orgs; }, }); @@ -1313,10 +1379,10 @@ BlazeComponent.extendComponent({ Meteor.call('setBoardOrgs', boardOrganizations, currentBoard._id); - Popup.close(); + Popup.back(); }, 'click #cancelLeaveBoardBtn'(){ - Popup.close(); + Popup.back(); }, }, ]; @@ -1340,6 +1406,13 @@ BlazeComponent.extendComponent({ const limitTeams = this.page.get() * Number.MAX_SAFE_INTEGER; this.subscribe('team', this.findOrgsOptions.get(), limitTeams, () => {}); }); + + this.findUsersOptions = new ReactiveVar({}); + this.userPage = new ReactiveVar(1); + this.autorun(() => { + const limitUsers = this.userPage.get() * Number.MAX_SAFE_INTEGER; + this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {}); + }); }, onRendered() { @@ -1384,11 +1457,39 @@ BlazeComponent.extendComponent({ }) if (selectedTeamId != "-1") { - Meteor.call('setBoardTeams', boardTeams, currentBoard._id); + let members = currentBoard.members; + + let query = { + "teams.teamId": { $in: boardTeams.map(t => t.teamId) }, + }; + + const boardTeamUsers = Users.find(query, { + sort: { sort: 1 }, + }); + + if(boardTeams !== undefined && boardTeams.length > 0){ + let index; + if(boardTeamUsers && boardTeamUsers.count() > 0){ + boardTeamUsers.forEach((u) => { + index = members.findIndex(function(m){ return m.userId == u._id}); + if(index == -1){ + members.push({ + "isActive": true, + "isAdmin": u.isAdmin !== undefined ? u.isAdmin : false, + "isCommentOnly" : false, + "isNoComments" : false, + "userId": u._id, + }); + } + }); + } + } + + Meteor.call('setBoardTeams', boardTeams, members, currentBoard._id); } } - Popup.close(); + Popup.back(); }, }, ]; @@ -1397,7 +1498,7 @@ BlazeComponent.extendComponent({ Template.addBoardTeamPopup.helpers({ teamsDatas() { - let teams = Team.find({}, {sort: { createdAt: -1 }}); + let teams = Team.find({}, {sort: { teamDisplayName: 1 }}); return teams; }, }); @@ -1413,6 +1514,13 @@ BlazeComponent.extendComponent({ const limitTeams = this.page.get() * Number.MAX_SAFE_INTEGER; this.subscribe('team', this.findOrgsOptions.get(), limitTeams, () => {}); }); + + this.findUsersOptions = new ReactiveVar({}); + this.userPage = new ReactiveVar(1); + this.autorun(() => { + const limitUsers = this.userPage.get() * Number.MAX_SAFE_INTEGER; + this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {}); + }); }, onRendered() { @@ -1449,12 +1557,33 @@ BlazeComponent.extendComponent({ } } - Meteor.call('setBoardTeams', boardTeams, currentBoard._id); + let members = currentBoard.members; + let query = { + "teams.teamId": stringTeamId + }; - Popup.close(); + const boardTeamUsers = Users.find(query, { + sort: { sort: 1 }, + }); + + if(currentBoard.teams !== undefined && currentBoard.teams.length > 0){ + let index; + if(boardTeamUsers && boardTeamUsers.count() > 0){ + boardTeamUsers.forEach((u) => { + index = members.findIndex(function(m){ return m.userId == u._id}); + if(index !== -1 && (u.isAdmin === undefined || u.isAdmin == false)){ + members.splice(index, 1); + } + }); + } + } + + Meteor.call('setBoardTeams', boardTeams, members, currentBoard._id); + + Popup.back(); }, 'click #cancelLeaveBoardTeamBtn'(){ - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl index 2570083b0..1f0c03d70 100644 --- a/client/components/sidebar/sidebar.styl +++ b/client/components/sidebar/sidebar.styl @@ -224,3 +224,24 @@ .cancelLeaveBoardBtn margin-left: 5% !important background-color: red !important + +.addTeamsLabel, .addOrganizationsLabel + font-weight: normal + +.js-manage-board-removeTeam:hover, .js-manage-board-removeTeam.is-active, +.js-manage-board-removeOrg:hover, .js-manage-board-removeOrg.is-active + box-shadow: 0 0 0 2px #e23210 inset !important + +.js-manage-board-addTeam:hover, .js-manage-board-addTeam.is-active, +.js-manage-board-addOrg:hover , .js-manage-board-addOrg.is-active + box-shadow: 0 0 0 2px #73ea10 inset !important + +.addTeamFaPlus + color: green !important + +.removeTeamFaMinus + color: red !important + +.divaddfaplusminus + padding-top: 5px; + margin-left: 40px; diff --git a/client/components/sidebar/sidebarArchives.js b/client/components/sidebar/sidebarArchives.js index daddd464f..32a23b0d0 100644 --- a/client/components/sidebar/sidebarArchives.js +++ b/client/components/sidebar/sidebarArchives.js @@ -1,4 +1,4 @@ -archivedRequested = false; +//archivedRequested = false; const subManager = new SubsManager(); BlazeComponent.extendComponent({ @@ -13,7 +13,7 @@ BlazeComponent.extendComponent({ const currentBoardId = Session.get('currentBoard'); if (!currentBoardId) return; const handle = subManager.subscribe('board', currentBoardId, true); - archivedRequested = true; + //archivedRequested = true; Tracker.nonreactive(() => { Tracker.autorun(() => { this.isArchiveReady.set(handle.ready()); @@ -94,13 +94,13 @@ BlazeComponent.extendComponent({ 'click .js-delete-card': Popup.afterConfirm('cardDelete', function() { const cardId = this._id; Cards.remove(cardId); - Popup.close(); + Popup.back(); }), 'click .js-delete-all-cards': Popup.afterConfirm('cardDelete', () => { this.archivedCards().forEach(card => { Cards.remove(card._id); }); - Popup.close(); + Popup.back(); }), 'click .js-restore-list'() { @@ -115,13 +115,13 @@ BlazeComponent.extendComponent({ 'click .js-delete-list': Popup.afterConfirm('listDelete', function() { this.remove(); - Popup.close(); + Popup.back(); }), 'click .js-delete-all-lists': Popup.afterConfirm('listDelete', () => { this.archivedLists().forEach(list => { list.remove(); }); - Popup.close(); + Popup.back(); }), 'click .js-restore-swimlane'() { @@ -138,7 +138,7 @@ BlazeComponent.extendComponent({ 'swimlaneDelete', function() { this.remove(); - Popup.close(); + Popup.back(); }, ), 'click .js-delete-all-swimlanes': Popup.afterConfirm( @@ -147,7 +147,7 @@ BlazeComponent.extendComponent({ this.archivedSwimlanes().forEach(swimlane => { swimlane.remove(); }); - Popup.close(); + Popup.back(); }, ), }, diff --git a/client/components/sidebar/sidebarCustomFields.jade b/client/components/sidebar/sidebarCustomFields.jade index d1970ef1a..d55379957 100644 --- a/client/components/sidebar/sidebarCustomFields.jade +++ b/client/components/sidebar/sidebarCustomFields.jade @@ -43,6 +43,14 @@ template(name="createCustomFieldPopup") option(value=value selected="selected") {{name}} else option(value=value) {{name}} + a.flex.js-field-show-sum-at-top-of-list(class="{{#if showSumAtTopOfList}}is-checked{{/if}}") + .materialCheckBox(class="{{#if showSumAtTopOfList}}is-checked{{/if}}") + span {{_ 'showSum-field-on-list'}} + + div.js-field-settings.js-field-settings-currency(class="{{#if isTypeNotSelected 'number'}}hide{{/if}}") + a.flex.js-field-show-sum-at-top-of-list(class="{{#if showSumAtTopOfList}}is-checked{{/if}}") + .materialCheckBox(class="{{#if showSumAtTopOfList}}is-checked{{/if}}") + span {{_ 'showSum-field-on-list'}} div.js-field-settings.js-field-settings-dropdown(class="{{#if isTypeNotSelected 'dropdown'}}hide{{/if}}") label diff --git a/client/components/sidebar/sidebarCustomFields.js b/client/components/sidebar/sidebarCustomFields.js index 2f1fa7dd6..0a35b08e6 100644 --- a/client/components/sidebar/sidebarCustomFields.js +++ b/client/components/sidebar/sidebarCustomFields.js @@ -234,6 +234,14 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({ $target.find('.materialCheckBox').toggleClass('is-checked'); $target.toggleClass('is-checked'); }, + 'click .js-field-show-sum-at-top-of-list'(evt) { + let $target = $(evt.target); + if (!$target.hasClass('js-field-show-sum-at-top-of-list')) { + $target = $target.parent(); + } + $target.find('.materialCheckBox').toggleClass('is-checked'); + $target.toggleClass('is-checked'); + }, 'click .primary'(evt) { evt.preventDefault(); @@ -248,6 +256,8 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({ this.find('.js-field-automatically-on-card.is-checked') !== null, alwaysOnCard: this.find('.js-field-always-on-card.is-checked') !== null, + showSumAtTopOfList: + this.find('.js-field-show-sum-at-top-of-list.is-checked') !== null, }; // insert or update @@ -273,7 +283,7 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({ } else { CustomFields.remove(customField._id); } - Popup.close(); + Popup.back(); }, ), }, @@ -292,6 +302,6 @@ CreateCustomFieldPopup.register('createCustomFieldPopup'); 'submit'(evt) { const customFieldId = this._id; CustomFields.remove(customFieldId); - Popup.close(); + Popup.back(); } });*/ diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index 641193d6e..4cc59e0eb 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -4,11 +4,18 @@ and #each x in y constructors to fix this. template(name="filterSidebar") - h3 {{_ 'list-filter-label'}} + h3 + i.fa.fa-trello + | {{_ 'list-filter-label'}} ul.sidebar-list form.js-list-filter input(type="text") hr + h3 + i.fa.fa-list-alt + | {{_ 'filter-card-title-label'}} + input.js-field-card-filter(type="text") + hr h3 i.fa.fa-tags | {{_ 'filter-labels-label'}} diff --git a/client/components/sidebar/sidebarFilters.js b/client/components/sidebar/sidebarFilters.js index 7f527b9f5..ca525a17b 100644 --- a/client/components/sidebar/sidebarFilters.js +++ b/client/components/sidebar/sidebarFilters.js @@ -8,6 +8,11 @@ BlazeComponent.extendComponent({ evt.preventDefault(); Filter.lists.set(this.find('.js-list-filter input').value.trim()); }, + 'change .js-field-card-filter'(evt) { + evt.preventDefault(); + Filter.title.set(this.find('.js-field-card-filter').value.trim()); + Filter.resetExceptions(); + }, 'click .js-toggle-label-filter'(evt) { evt.preventDefault(); Filter.labelIds.toggle(this.currentData()._id); @@ -94,14 +99,14 @@ BlazeComponent.extendComponent({ }).register('filterSidebar'); function mutateSelectedCards(mutationName, ...args) { - Cards.find(MultiSelection.getMongoSelector()).forEach(card => { + Cards.find(MultiSelection.getMongoSelector(), {sort: ['sort']}).forEach(card => { card[mutationName](...args); }); } BlazeComponent.extendComponent({ mapSelection(kind, _id) { - return Cards.find(MultiSelection.getMongoSelector()).map(card => { + return Cards.find(MultiSelection.getMongoSelector(), {sort: ['sort']}).map(card => { const methodName = kind === 'label' ? 'hasLabel' : 'isAssigned'; return card[methodName](_id); }); @@ -171,22 +176,22 @@ Template.multiselectionSidebar.helpers({ Template.disambiguateMultiLabelPopup.events({ 'click .js-remove-label'() { mutateSelectedCards('removeLabel', this._id); - Popup.close(); + Popup.back(); }, 'click .js-add-label'() { mutateSelectedCards('addLabel', this._id); - Popup.close(); + Popup.back(); }, }); Template.disambiguateMultiMemberPopup.events({ 'click .js-unassign-member'() { mutateSelectedCards('assignMember', this._id); - Popup.close(); + Popup.back(); }, 'click .js-assign-member'() { mutateSelectedCards('unassignMember', this._id); - Popup.close(); + Popup.back(); }, }); diff --git a/client/components/sidebar/sidebarSearches.jade b/client/components/sidebar/sidebarSearches.jade index 212ba57a2..426a0e917 100644 --- a/client/components/sidebar/sidebarSearches.jade +++ b/client/components/sidebar/sidebarSearches.jade @@ -3,10 +3,14 @@ template(name="searchSidebar") input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto") .list-body .minilists.clearfix.js-minilists + hr + | {{_ 'lists' }} each (lists) a.minilist-wrapper.js-minilist(href=originRelativeUrl) +minilist(this) .minicards.clearfix.js-minicards - each (results) + hr + | {{_ 'cards' }} + each (cards) a.minicard-wrapper.js-minicard(href=originRelativeUrl) +minicard(this) diff --git a/client/components/sidebar/sidebarSearches.js b/client/components/sidebar/sidebarSearches.js index 026772601..f5e8a5c82 100644 --- a/client/components/sidebar/sidebarSearches.js +++ b/client/components/sidebar/sidebarSearches.js @@ -3,7 +3,7 @@ BlazeComponent.extendComponent({ this.term = new ReactiveVar(''); }, - results() { + cards() { const currentBoard = Boards.findOne(Session.get('currentBoard')); return currentBoard.searchCards(this.term.get()); }, @@ -13,9 +13,24 @@ BlazeComponent.extendComponent({ return currentBoard.searchLists(this.term.get()); }, + clickOnMiniCard(evt) { + if (Utils.isMiniScreen()) { + evt.preventDefault(); + Session.set('popupCardId', this.currentData()._id); + this.cardDetailsPopup(evt); + } + }, + + cardDetailsPopup(event) { + if (!Popup.isOpen()) { + Popup.open("cardDetails")(event); + } + }, + events() { return [ { + 'click .js-minicard': this.clickOnMiniCard, 'submit .js-search-term-form'(evt) { evt.preventDefault(); this.term.set(evt.target.searchTerm.value); diff --git a/client/components/swimlanes/swimlaneHeader.jade b/client/components/swimlanes/swimlaneHeader.jade index 5319402c2..072b7ccee 100644 --- a/client/components/swimlanes/swimlaneHeader.jade +++ b/client/components/swimlanes/swimlaneHeader.jade @@ -26,7 +26,7 @@ template(name="swimlaneFixedHeader") a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}") a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}") unless isMiniScreen - if showDesktopDragHandles + if isShowDesktopDragHandles a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle if isMiniScreen a.swimlane-header-miniscreen-handle.handle.fa.fa-arrows.js-swimlane-header-handle diff --git a/client/components/swimlanes/swimlaneHeader.js b/client/components/swimlanes/swimlaneHeader.js index 9d01ee34c..5b9398ba3 100644 --- a/client/components/swimlanes/swimlaneHeader.js +++ b/client/components/swimlanes/swimlaneHeader.js @@ -28,19 +28,6 @@ BlazeComponent.extendComponent({ }, }).register('swimlaneHeader'); -Template.swimlaneHeader.helpers({ - showDesktopDragHandles() { - currentUser = Meteor.user(); - if (currentUser) { - return (currentUser.profile || {}).showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - return true; - } else { - return false; - } - }, -}); - Template.swimlaneFixedHeader.helpers({ isBoardAdmin() { return Meteor.user().isBoardAdmin(); @@ -52,7 +39,7 @@ Template.swimlaneActionPopup.events({ 'click .js-close-swimlane'(event) { event.preventDefault(); this.archive(); - Popup.close(); + Popup.back(); }, 'click .js-move-swimlane': Popup.open('moveSwimlane'), 'click .js-copy-swimlane': Popup.open('copySwimlane'), @@ -101,7 +88,7 @@ BlazeComponent.extendComponent({ // XXX ideally, we should move the popup to the newly // created swimlane so a user can add more than one swimlane // with a minimum of interactions - Popup.close(); + Popup.back(); }, 'click .js-swimlane-template': Popup.open('searchElement'), }, @@ -131,11 +118,11 @@ BlazeComponent.extendComponent({ }, 'click .js-submit'() { this.currentSwimlane.setColor(this.currentColor.get()); - Popup.close(); + Popup.back(); }, 'click .js-remove-color'() { this.currentSwimlane.setColor(null); - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/swimlanes/swimlanes.jade b/client/components/swimlanes/swimlanes.jade index 3040917bb..d10fe97e2 100644 --- a/client/components/swimlanes/swimlanes.jade +++ b/client/components/swimlanes/swimlanes.jade @@ -14,7 +14,8 @@ template(name="swimlane") +addListForm else each lists - +list(this) + if visible this + +list(this) if currentCardIsInThisList _id ../_id +cardDetails(currentCard) if currentUser.isBoardMember @@ -52,6 +53,7 @@ template(name="addListForm") autocomplete="off" autofocus) .edit-controls.clearfix button.primary.confirm(type="submit") {{_ 'save'}} + .fa.fa-times-thin.js-close-inlined-form unless currentBoard.isTemplatesBoard unless currentBoard.isTemplateBoard span.quiet diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index 6d72fbfef..b8a94cbff 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -9,7 +9,7 @@ function currentListIsInThisSwimlane(swimlaneId) { } function currentCardIsInThisList(listId, swimlaneId) { - const currentCard = Cards.findOne(Session.get('currentCard')); + const currentCard = Utils.getCurrentCard(); const currentUser = Meteor.user(); if ( currentUser && @@ -57,7 +57,7 @@ function initSortable(boardComponent, $listsDom) { tolerance: 'pointer', helper: 'clone', items: '.js-list:not(.js-list-composer)', - placeholder: 'list placeholder', + placeholder: 'js-list placeholder', distance: 7, start(evt, ui) { ui.placeholder.height(ui.helper.height()); @@ -95,22 +95,11 @@ function initSortable(boardComponent, $listsDom) { //} boardComponent.autorun(() => { - let showDesktopDragHandles = false; - currentUser = Meteor.user(); - if (currentUser) { - showDesktopDragHandles = (currentUser.profile || {}) - .showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - showDesktopDragHandles = true; - } else { - showDesktopDragHandles = false; - } - - if (Utils.isMiniScreen() || showDesktopDragHandles) { + if (Utils.isMiniScreenOrShowDesktopDragHandles()) { $listsDom.sortable({ handle: '.js-list-handle', }); - } else if (!Utils.isMiniScreen() && !showDesktopDragHandles) { + } else { $listsDom.sortable({ handle: '.js-list-header', }); @@ -123,7 +112,7 @@ function initSortable(boardComponent, $listsDom) { 'disabled', // Disable drag-dropping when user is not member/is worker //!userIsMember() || Meteor.user().isWorker(), - !Meteor.user().isBoardAdmin(), + !Meteor.user() || !Meteor.user().isBoardAdmin(), // Not disable drag-dropping while in multi-selection mode // MultiSelection.isActive() || !userIsMember(), ); @@ -136,7 +125,7 @@ BlazeComponent.extendComponent({ const boardComponent = this.parentComponent(); const $listsDom = this.$('.js-lists'); - if (!Session.get('currentCard')) { + if (!Utils.getCurrentCardId()) { boardComponent.scrollLeft(); } @@ -148,19 +137,38 @@ BlazeComponent.extendComponent({ this._isDragging = false; this._lastDragPositionX = 0; }, - id() { return this._id; }, - currentCardIsInThisList(listId, swimlaneId) { return currentCardIsInThisList(listId, swimlaneId); }, - currentListIsInThisSwimlane(swimlaneId) { return currentListIsInThisSwimlane(swimlaneId); }, - + visible(list) { + if (list.archived) { + // Show archived list only when filter archive is on + if (!Filter.archive.isSelected()) { + return false; + } + } + if (Filter.lists._isActive()) { + if (!list.title.match(Filter.lists.getRegexSelector())) { + return false; + } + } + if (Filter.hideEmpty.isSelected()) { + const swimlaneId = this.parentComponent() + .parentComponent() + .data()._id; + const cards = list.cards(swimlaneId); + if (cards.count() === 0) { + return false; + } + } + return true; + }, events() { return [ { @@ -172,19 +180,8 @@ BlazeComponent.extendComponent({ // the user will legitimately expect to be able to select some text with // his mouse. - let showDesktopDragHandles = false; - currentUser = Meteor.user(); - if (currentUser) { - showDesktopDragHandles = (currentUser.profile || {}) - .showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - showDesktopDragHandles = true; - } else { - showDesktopDragHandles = false; - } - const noDragInside = ['a', 'input', 'textarea', 'p'].concat( - Utils.isMiniScreen() || showDesktopDragHandles + Utils.isMiniScreenOrShowDesktopDragHandles() ? ['.js-list-handle', '.js-swimlane-header-handle'] : ['.js-list-header'], ); @@ -240,13 +237,15 @@ BlazeComponent.extendComponent({ { submit(evt) { evt.preventDefault(); + const lastList = this.currentBoard.getLastList(); + const sortIndex = Utils.calculateIndexData(lastList, null).base; const titleInput = this.find('.list-name-input'); const title = titleInput.value.trim(); if (title) { Lists.insert({ title, boardId: Session.get('currentBoard'), - sort: $('.list').length, + sort: sortIndex, type: this.isListTemplatesSwimlane ? 'template-list' : 'list', swimlaneId: this.currentBoard.isTemplatesBoard() ? this.currentSwimlane._id @@ -264,16 +263,6 @@ BlazeComponent.extendComponent({ }).register('addListForm'); Template.swimlane.helpers({ - showDesktopDragHandles() { - currentUser = Meteor.user(); - if (currentUser) { - return (currentUser.profile || {}).showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - return true; - } else { - return false; - } - }, canSeeAddList() { return Meteor.user().isBoardAdmin(); /* @@ -291,8 +280,8 @@ BlazeComponent.extendComponent({ }, visible(list) { if (list.archived) { - // Show archived list only when filter archive is on or archive is selected - if (!(Filter.archive.isSelected() || archivedRequested)) { + // Show archived list only when filter archive is on + if (!Filter.archive.isSelected()) { return false; } } @@ -316,7 +305,7 @@ BlazeComponent.extendComponent({ const boardComponent = this.parentComponent(); const $listsDom = this.$('.js-lists'); - if (!Session.get('currentCard')) { + if (!Utils.getCurrentCardId()) { boardComponent.scrollLeft(); } @@ -359,7 +348,7 @@ class MoveSwimlaneComponent extends BlazeComponent { boardId = bSelect.options[bSelect.selectedIndex].value; Meteor.call(this.serverMethod, this.currentSwimlane._id, boardId); } - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/components/users/userAvatar.jade b/client/components/users/userAvatar.jade index 33ce76f8b..84718fe74 100644 --- a/client/components/users/userAvatar.jade +++ b/client/components/users/userAvatar.jade @@ -32,7 +32,9 @@ template(name="boardOrgRow") td if currentUser.isBoardAdmin a.member.orgOrTeamMember.add-member.js-manage-board-removeOrg(title="{{_ 'remove-from-board'}}") - i.fa.fa-minus + i.removeTeamFaMinus.fa.fa-minus + .divaddfaplusminus + | {{_ 'remove-btn'}} template(name="boardTeamRow") tr @@ -43,7 +45,9 @@ template(name="boardTeamRow") td if currentUser.isBoardAdmin a.member.orgOrTeamMember.add-member.js-manage-board-removeTeam(title="{{_ 'remove-from-board'}}") - i.fa.fa-minus + i.removeTeamFaMinus.fa.fa-minus + .divaddfaplusminus + | {{_ 'remove-btn'}} template(name="boardOrgName") svg.avatar.avatar-initials(viewBox="0 0 {{orgViewPortWidth}} 15") diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 3fe008ca3..22e5af524 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -274,7 +274,7 @@ Template.cardMembersPopup.helpers({ Template.cardMembersPopup.events({ 'click .js-select-member'(event) { - const card = Cards.findOne(Session.get('currentCard')); + const card = Utils.getCurrentCard(); const memberId = this.userId; card.toggleMember(memberId); event.preventDefault(); @@ -290,7 +290,7 @@ Template.cardMemberPopup.helpers({ Template.cardMemberPopup.events({ 'click .js-remove-member'() { Cards.findOne(this.cardId).unassignMember(this.userId); - Popup.close(); + Popup.back(); }, 'click .js-edit-profile': Popup.open('editProfile'), }); diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index 456a450e3..4d7bd89a5 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -49,10 +49,16 @@ template(name="memberMenuPopup") i.fa.fa-lock | {{_ 'admin-panel'}} hr - li - a.js-edit-profile - i.fa.fa-user - | {{_ 'edit-profile'}} + if isSameDomainNameSettingValue + li + a.js-invite-people + i.fa.fa-envelope + | {{_ 'invite-people'}} + if isNotOAuth2AuthenticationMethod + li + a.js-edit-profile + i.fa.fa-user + | {{_ 'edit-profile'}} li a.js-change-settings i.fa.fa-cog @@ -62,10 +68,11 @@ template(name="memberMenuPopup") i.fa.fa-picture-o | {{_ 'edit-avatar'}} unless isSandstorm - li - a.js-change-password - i.fa.fa-key - | {{_ 'changePasswordPopup-title'}} + if isNotOAuth2AuthenticationMethod + li + a.js-change-password + i.fa.fa-key + | {{_ 'changePasswordPopup-title'}} li a.js-change-language i.fa.fa-flag @@ -78,6 +85,30 @@ template(name="memberMenuPopup") i.fa.fa-sign-out | {{_ 'log-out'}} +template(name="invitePeoplePopup") + ul#registration-setting.setting-detail + li + #invite-people-infos + li + br + li + .invite-people(class="{{#if currentSetting.disableRegistration}}{{else}}hide{{/if}}") + ul + li + .title {{_ 'invite-people'}} + textarea#email-to-invite.wekan-form-control(rows='5', placeholder="{{_ 'email-addresses'}}") + li + .title {{_ 'to-boards'}} + .bg-white + each boards + a.option.flex.js-toggle-board-choose(id= _id) + .materialCheckBox(data-id= _id) + + span= title + + li + button.js-email-invite.primary {{_ 'invite'}} + template(name="editProfilePopup") form label @@ -132,7 +163,7 @@ template(name="changeSettingsPopup") a.js-toggle-desktop-drag-handles i.fa.fa-arrows | {{_ 'show-desktop-drag-handles'}} - if showDesktopDragHandles + if isShowDesktopDragHandles i.fa.fa-check unless currentUser.isWorker li diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index bf46b997a..67eefa888 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -3,6 +3,12 @@ Template.headerUserBar.events({ 'click .js-change-avatar': Popup.open('changeAvatar'), }); +BlazeComponent.extendComponent({ + onCreated() { + Meteor.subscribe('setting'); + }, +}).register('memberMenuPopup'); + Template.memberMenuPopup.helpers({ templatesBoardId() { currentUser = Meteor.user(); @@ -22,18 +28,47 @@ Template.memberMenuPopup.helpers({ return false; } }, + isSameDomainNameSettingValue(){ + const currSett = Settings.findOne(); + if(currSett && currSett != undefined && currSett.disableRegistration && currSett.mailDomainName !== undefined && currSett.mailDomainName != ""){ + currentUser = Meteor.user(); + if (currentUser) { + let found = false; + for(let i = 0; i < currentUser.emails.length; i++) { + if(currentUser.emails[i].address.endsWith(currSett.mailDomainName)){ + found = true; + break; + } + } + return found; + } else { + return true; + } + } + else + return false; + }, + isNotOAuth2AuthenticationMethod(){ + currentUser = Meteor.user(); + if (currentUser) { + return currentUser.authenticationMethod.toLowerCase() != 'oauth2'; + } else { + return true; + } + } }); Template.memberMenuPopup.events({ 'click .js-my-cards'() { - Popup.close(); + Popup.back(); }, 'click .js-due-cards'() { - Popup.close(); + Popup.back(); }, 'click .js-open-archived-board'() { Modal.open('archivedBoards'); }, + 'click .js-invite-people': Popup.open('invitePeople'), 'click .js-edit-profile': Popup.open('editProfile'), 'click .js-change-settings': Popup.open('changeSettings'), 'click .js-change-avatar': Popup.open('changeAvatar'), @@ -45,7 +80,67 @@ Template.memberMenuPopup.events({ AccountsTemplates.logout(); }, 'click .js-go-setting'() { - Popup.close(); + Popup.back(); + }, +}); + +BlazeComponent.extendComponent({ + onCreated() { + Meteor.subscribe('setting'); + }, +}).register('editProfilePopup'); + +Template.invitePeoplePopup.events({ + 'click a.js-toggle-board-choose'(event){ + let target = $(event.target); + if (!target.hasClass('js-toggle-board-choose')) { + target = target.parent(); + } + const checkboxId = target.attr('id'); + $(`#${checkboxId} .materialCheckBox`).toggleClass('is-checked'); + $(`#${checkboxId}`).toggleClass('is-checked'); + }, + 'click button.js-email-invite'(event){ + const emails = $('#email-to-invite') + .val() + .toLowerCase() + .trim() + .split('\n') + .join(',') + .split(','); + const boardsToInvite = []; + $('.js-toggle-board-choose .materialCheckBox.is-checked').each(function() { + boardsToInvite.push($(this).data('id')); + }); + const validEmails = []; + emails.forEach(email => { + if (email && SimpleSchema.RegEx.Email.test(email.trim())) { + validEmails.push(email.trim()); + } + }); + if (validEmails.length) { + Meteor.call('sendInvitation', validEmails, boardsToInvite, (_, rc) => { + if (rc == 0) { + let divInfos = document.getElementById("invite-people-infos"); + if(divInfos && divInfos !== undefined){ + divInfos.innerHTML = "" + TAPi18n.__('invite-people-success') + ""; + } + } + else{ + let divInfos = document.getElementById("invite-people-infos"); + if(divInfos && divInfos !== undefined){ + divInfos.innerHTML = "" + TAPi18n.__('invite-people-error') + ""; + } + } + // Popup.close(); + }); + } + }, +}); + +Template.invitePeoplePopup.helpers({ + currentSetting() { + return Settings.findOne(); }, }); @@ -147,7 +242,7 @@ Template.editProfilePopup.events({ } else Popup.back(); }, 'click #deleteButton': Popup.afterConfirm('userDelete', function() { - Popup.close(); + Popup.back(); Users.remove(Meteor.userId()); AccountsTemplates.logout(); }), @@ -171,23 +266,41 @@ 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 === 'de-CH') { + name = 'Deutsch (Schweiz)'; + } else if (lang.name === 'de-AT') { + name = 'Deutsch (Österreich)'; + } else if (lang.name === 'en-DE') { + name = 'English (Germany)'; } else if (lang.name === 'fa-IR') { // fa-IR = Persian (Iran) name = 'فارسی/پارسی (ایران‎)'; - } else if (lang.name === 'de-CH') { - name = 'Deutsch (Schweiz)'; } else if (lang.name === 'fr-BE') { name = 'Français (Belgique)'; } else if (lang.name === 'fr-CA') { name = 'Français (Canada)'; + } else if (lang.name === 'fr-CH') { + name = 'Français (Schweiz)'; + } else if (lang.name === 'gu-IN') { + // gu-IN = Gurajati (India) + name = 'ગુજરાતી'; + } else if (lang.name === 'hi-IN') { + // hi-IN = Hindi (India) + name = 'हिंदी (भारत)'; } else if (lang.name === 'ig') { name = 'Igbo'; } else if (lang.name === 'lv') { name = 'Latviešu'; } else if (lang.name === 'latviešu valoda') { name = 'Latviešu'; + } else if (lang.name === 'ms-MY') { + // ms-MY = Malay (Malaysia) + name = 'بهاس ملايو'; } else if (lang.name === 'en-IT') { name = 'English (Italy)'; + } else if (lang.name === 'el-GR') { + // el-GR = Greek (Greece) + name = 'Ελληνικά (Ελλάδα)'; } else if (lang.name === 'Español') { name = 'español'; } else if (lang.name === 'es_419') { @@ -219,6 +332,7 @@ Template.changeLanguagePopup.helpers({ } else if (lang.name === 'st') { name = 'Sãotomense'; } else if (lang.name === '繁体中文(台湾)') { + // Traditional Chinese (Taiwan) name = '繁體中文(台灣)'; } return { tag, name }; @@ -249,16 +363,6 @@ Template.changeLanguagePopup.events({ }); Template.changeSettingsPopup.helpers({ - showDesktopDragHandles() { - currentUser = Meteor.user(); - if (currentUser) { - return (currentUser.profile || {}).showDesktopDragHandles; - } else if (window.localStorage.getItem('showDesktopDragHandles')) { - return true; - } else { - return false; - } - }, hiddenSystemMessages() { currentUser = Meteor.user(); if (currentUser) { diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index a4c610612..22194f3bd 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -1,19 +1,11 @@ Blaze.registerHelper('currentBoard', () => { - const boardId = Session.get('currentBoard'); - if (boardId) { - return Boards.findOne(boardId); - } else { - return null; - } + const ret = Utils.getCurrentBoard(); + return ret; }); Blaze.registerHelper('currentCard', () => { - const cardId = Session.get('currentCard'); - if (cardId) { - return Cards.findOne(cardId); - } else { - return null; - } + const ret = Utils.getCurrentCard(); + return ret; }); Blaze.registerHelper('currentList', () => { diff --git a/client/lib/cardSearch.js b/client/lib/cardSearch.js index eb7eed64e..6daada3c8 100644 --- a/client/lib/cardSearch.js +++ b/client/lib/cardSearch.js @@ -33,11 +33,11 @@ export class CardSearchPagedComponent extends BlazeComponent { that.hasResults.set(false); that.serverError.set(true); // eslint-disable-next-line no-console - console.log('Error.reason:', error.reason); + //console.log('Error.reason:', error.reason); // eslint-disable-next-line no-console - console.log('Error.message:', error.message); + //console.log('Error.message:', error.message); // eslint-disable-next-line no-console - console.log('Error.stack:', error.stack); + //console.log('Error.stack:', error.stack); }, }; } diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js index b793f17ad..f57bcdaa3 100644 --- a/client/lib/datepicker.js +++ b/client/lib/datepicker.js @@ -34,6 +34,7 @@ export class DatePicker extends BlazeComponent { todayBtn: 'linked', language: TAPi18n.getLanguage(), weekStart: this.startDayOfWeek(), + calendarWeeks: true, }) .on( 'changeDate', @@ -119,7 +120,7 @@ export class DatePicker extends BlazeComponent { } if (newCompleteDate.isValid()) { this._storeDate(newCompleteDate.toDate()); - Popup.close(); + Popup.back(); } else if (!this.error) { this.error.set('invalid'); } @@ -127,7 +128,7 @@ export class DatePicker extends BlazeComponent { 'click .js-delete-date'(evt) { evt.preventDefault(); this._deleteDate(); - Popup.close(); + Popup.back(); }, }, ]; diff --git a/client/lib/exportHTML.js b/client/lib/exportHTML.js index 59a0612fc..1d00ccea5 100644 --- a/client/lib/exportHTML.js +++ b/client/lib/exportHTML.js @@ -187,7 +187,7 @@ window.ExportHtml = Popup => { const boardSlug = getBoardSlug(); await addJsonExportToZip(zip, boardSlug); - Popup.close(); + Popup.back(); closeSidebar(); cleanBoardHtml(); diff --git a/client/lib/filter.js b/client/lib/filter.js index 94d931cee..283dbcd07 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -155,6 +155,39 @@ class DateFilter { } } +class StringFilter { + constructor() { + this._dep = new Tracker.Dependency(); + this.subField = ''; // Prevent name mangling in Filter + this._filter = ''; + } + + set(str) { + this._filter = str; + this._dep.changed(); + } + + reset() { + this._filter = ''; + this._dep.changed(); + } + + _isActive() { + this._dep.depend(); + return this._filter !== ''; + } + + _getMongoSelector() { + this._dep.depend(); + return {$regex : this._filter, $options: 'i'}; + } + + _getEmptySelector() { + this._dep.depend(); + return {$regex : this._filter, $options: 'i'}; + } +} + // Use a "set" filter for a field that is a set of documents uniquely // identified. For instance `{ labels: ['labelA', 'labelC', 'labelD'] }`. // use "subField" for searching inside object Fields. @@ -611,6 +644,7 @@ Filter = { archive: new SetFilter(), hideEmpty: new SetFilter(), dueAt: new DateFilter(), + title: new StringFilter(), customFields: new SetFilter('_id'), advanced: new AdvancedFilter(), lists: new AdvancedFilter(), // we need the ability to filter list by name as well @@ -622,6 +656,7 @@ Filter = { 'archive', 'hideEmpty', 'dueAt', + 'title', 'customFields', ], @@ -647,9 +682,11 @@ Filter = { const filterSelector = {}; const emptySelector = {}; let includeEmptySelectors = false; + let isFilterActive = false; // we don't want there is only Filter.lists this._fields.forEach(fieldName => { const filter = this[fieldName]; if (filter._isActive()) { + isFilterActive = true; if (filter.subField !== '') { filterSelector[ `${fieldName}.${filter.subField}` @@ -680,12 +717,23 @@ Filter = { ) selectors.push(filterSelector); if (includeEmptySelectors) selectors.push(emptySelector); - if (this.advanced._isActive()) + if (this.advanced._isActive()) { + isFilterActive = true; selectors.push(this.advanced._getMongoSelector()); - - return { - $or: selectors, - }; + } + + if(isFilterActive) { + return { + $or: selectors, + }; + } + else { + // we don't want there is only Filter.lists + // otherwise no card will be displayed ... + // selectors = [exceptionsSelector]; + // will return [{"_id":{"$in":[]}}] + return {}; + } }, mongoSelector(additionalSelector) { diff --git a/client/lib/inlinedform.js b/client/lib/inlinedform.js index f2ebe31e0..409b259d0 100644 --- a/client/lib/inlinedform.js +++ b/client/lib/inlinedform.js @@ -29,10 +29,15 @@ InlinedForm = BlazeComponent.extendComponent({ }, open(evt) { - evt && evt.preventDefault(); + if (evt) { + evt.preventDefault(); + // Close currently opened form, if any + EscapeActions.clickExecute(evt.target, 'inlinedForm'); + } else { + // Close currently opened form, if any + EscapeActions.executeUpTo('inlinedForm'); + } - // Close currently opened form, if any - EscapeActions.executeUpTo('inlinedForm'); this.isOpen.set(true); currentlyOpenedForm.set(this); }, @@ -44,7 +49,8 @@ InlinedForm = BlazeComponent.extendComponent({ getValue() { const input = this.find('textarea,input[type=text]'); - return this.isOpen.get() && input && input.value; + // \s without \n + unicode (https://developer.mozilla.org/de/docs/Web/JavaScript/Guide/Regular_Expressions#special-white-space) + return this.isOpen.get() && input && input.value.replaceAll(/[ \f\r\t\v]+$/gm, ''); }, events() { diff --git a/client/lib/jquery-ui.js b/client/lib/jquery-ui.js new file mode 100644 index 000000000..6bdcf2f5a --- /dev/null +++ b/client/lib/jquery-ui.js @@ -0,0 +1,20 @@ +// https://bugs.jqueryui.com/ticket/15020 +// required for sortable +require('jquery-ui/ui/widget') +require('jquery-ui/ui/scroll-parent') +require('jquery-ui/ui/data') +require('jquery-ui/ui/widgets/mouse') +require('jquery-ui/ui/ie') +require('jquery-ui/ui/widgets/sortable') + +// required for draggable +require('jquery-ui/ui/plugin') +require('jquery-ui/ui/safe-active-element') +require('jquery-ui/ui/safe-blur') +require('jquery-ui/ui/widgets/draggable') + +// everything already required for droppable +require('jquery-ui/ui/widgets/droppable') + +// enable touch on mobile +require('jquery-ui-touch-punch') diff --git a/client/lib/keyboard.js b/client/lib/keyboard.js index 9f35009d3..4384fe135 100644 --- a/client/lib/keyboard.js +++ b/client/lib/keyboard.js @@ -54,7 +54,7 @@ Mousetrap.bind('/', () => { }); Mousetrap.bind(['down', 'up'], (evt, key) => { - if (!Session.get('currentCard')) { + if (!Utils.getCurrentCardId()) { return; } diff --git a/client/lib/multiSelection.js b/client/lib/multiSelection.js index ab6a046f7..8ba3173f1 100644 --- a/client/lib/multiSelection.js +++ b/client/lib/multiSelection.js @@ -60,6 +60,8 @@ MultiSelection = { startRangeCardId: null, + _sidebarWasOpen: false, + reset() { this._selectedCards.set([]); }, @@ -84,11 +86,15 @@ MultiSelection = { activate() { if (!this.isActive()) { + this._sidebarWasOpen = Sidebar.isOpen(); EscapeActions.executeUpTo('detailsPane'); this._isActive.set(true); Tracker.flush(); } Sidebar.setView(this.sidebarView); + if(Utils.isMiniScreen()) { + Sidebar.hide(); + } }, disable() { @@ -96,6 +102,9 @@ MultiSelection = { this._isActive.set(false); if (Sidebar && Sidebar.getView() === this.sidebarView) { Sidebar.setView(); + if(!this._sidebarWasOpen) { + Sidebar.hide(); + } } this.reset(); } diff --git a/client/lib/popup.js b/client/lib/popup.js index cae226594..01f34f92a 100644 --- a/client/lib/popup.js +++ b/client/lib/popup.js @@ -30,7 +30,11 @@ window.Popup = new (class { function clickFromPopup(evt) { return $(evt.target).closest('.js-pop-over').length !== 0; } - return function(evt) { + /** opens the popup + * @param evt the current event + * @param options options (dataContextIfCurrentDataIsUndefined use this dataContext if this.currentData() is undefined) + */ + return function(evt, options) { // If a popup is already opened, clicking again on the opener element // should close it -- and interrupt the current `open` function. if (self.isOpen()) { @@ -67,7 +71,7 @@ window.Popup = new (class { title: self._getTitle(popupName), depth: self._stack.length, offset: self._getOffset(openerElement), - dataContext: (this && this.currentData && this.currentData()) || this, + dataContext: (this && this.currentData && this.currentData()) || (options && options.dataContextIfCurrentDataIsUndefined) || this, }); // If there are no popup currently opened we use the Blaze API to render @@ -201,7 +205,7 @@ escapeActions.forEach(actionName => { () => Popup[actionName](), () => Popup.isOpen(), { - noClickEscapeOn: '.js-pop-over,.js-open-card-title-popup', + noClickEscapeOn: '.js-pop-over,.js-open-card-title-popup,.js-open-inlined-form', enabledOnClick: actionName === 'close', }, ); diff --git a/client/lib/tests/Utils.tests.js b/client/lib/tests/Utils.tests.js index 5a368876c..1ffcd8105 100644 --- a/client/lib/tests/Utils.tests.js +++ b/client/lib/tests/Utils.tests.js @@ -163,18 +163,6 @@ describe('Utils', function() { it('has no tests yet'); }); - describe(Utils.isTouchDevice.name, function() { - it('has no tests yet'); - }); - - describe(Utils.calculateTouchDistance.name, function() { - it('has no tests yet'); - }); - - describe(Utils.enableClickOnTouch.name, function() { - it('has no tests yet'); - }); - describe(Utils.manageCustomUI.name, function() { it('has no tests yet'); }); diff --git a/client/lib/utils.js b/client/lib/utils.js index f8f684325..eb53a6a4c 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -1,4 +1,45 @@ Utils = { + /** returns the current board id + *
  • returns the current board id or the board id of the popup card if set + */ + getCurrentBoardId() { + let popupCardBoardId = Session.get('popupCardBoardId'); + let currentBoard = Session.get('currentBoard'); + let ret = currentBoard; + if (popupCardBoardId) { + ret = popupCardBoardId; + } + return ret; + }, + getCurrentCardId(ignorePopupCard) { + let ret = Session.get('currentCard'); + if (!ret && !ignorePopupCard) { + ret = Utils.getPopupCardId(); + } + return ret; + }, + getPopupCardId() { + const ret = Session.get('popupCardId'); + return ret; + }, + /** returns the current board + *
  • returns the current board or the board of the popup card if set + */ + getCurrentBoard() { + const boardId = Utils.getCurrentBoardId(); + const ret = Boards.findOne(boardId); + return ret; + }, + getCurrentCard(ignorePopupCard) { + const cardId = Utils.getCurrentCardId(ignorePopupCard); + const ret = Cards.findOne(cardId); + return ret; + }, + getPopupCard() { + const cardId = Utils.getPopupCardId(); + const ret = Cards.findOne(cardId); + return ret; + }, reload () { // we move all window.location.reload calls into this function // so we can disable it when running tests. @@ -248,6 +289,8 @@ Utils = { const currentUser = Meteor.user(); if (currentUser) { return (currentUser.profile || {}).showDesktopDragHandles; + } else if (window.localStorage.getItem('showDesktopDragHandles')) { + return true; } else { return false; } @@ -321,67 +364,6 @@ Utils = { }; }, - // Detect touch device - isTouchDevice() { - const isTouchable = (() => { - const prefixes = ' -webkit- -moz- -o- -ms- '.split(' '); - const mq = function(query) { - return window.matchMedia(query).matches; - }; - - if ( - 'ontouchstart' in window || - (window.DocumentTouch && document instanceof window.DocumentTouch) - ) { - return true; - } - - // include the 'heartz' as a way to have a non matching MQ to help terminate the join - // https://git.io/vznFH - const query = [ - '(', - prefixes.join('touch-enabled),('), - 'heartz', - ')', - ].join(''); - return mq(query); - })(); - Utils.isTouchDevice = () => isTouchable; - return isTouchable; - }, - - calculateTouchDistance(touchA, touchB) { - return Math.sqrt( - Math.pow(touchA.screenX - touchB.screenX, 2) + - Math.pow(touchA.screenY - touchB.screenY, 2), - ); - }, - - enableClickOnTouch(selector) { - let touchStart = null; - let lastTouch = null; - - $(document).on('touchstart', selector, function(e) { - touchStart = e.originalEvent.touches[0]; - }); - $(document).on('touchmove', selector, function(e) { - const touches = e.originalEvent.touches; - lastTouch = touches[touches.length - 1]; - }); - $(document).on('touchend', selector, function(e) { - if ( - touchStart && - lastTouch && - Utils.calculateTouchDistance(touchStart, lastTouch) <= 20 - ) { - e.preventDefault(); - const clickEvent = document.createEvent('MouseEvents'); - clickEvent.initEvent('click', true, true); - e.target.dispatchEvent(clickEvent); - } - }); - }, - manageCustomUI() { Meteor.call('getCustomUI', (err, data) => { if (err && err.error[0] === 'var-not-exist') { @@ -483,6 +465,62 @@ Utils = { } return finalString; }, + + fallbackCopyTextToClipboard(text) { + var textArea = document.createElement("textarea"); + textArea.value = text; + + // Avoid scrolling to bottom + textArea.style.top = "0"; + textArea.style.left = "0"; + textArea.style.position = "fixed"; + + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + document.execCommand('copy'); + return Promise.resolve(true); + } catch (e) { + return Promise.reject(false); + } finally { + document.body.removeChild(textArea); + } + }, + + /** copy the text to the clipboard + * @see https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript/30810322#30810322 + * @param string copy this text to the clipboard + * @return Promise + */ + copyTextToClipboard(text) { + let ret; + if (navigator.clipboard) { + ret = navigator.clipboard.writeText(text).then(function() { + }, function(err) { + console.error('Async: Could not copy text: ', err); + }); + } else { + ret = Utils.fallbackCopyTextToClipboard(text); + } + return ret; + }, + + /** show the "copied!" message + * @param promise the promise of Utils.copyTextToClipboard + * @param $tooltip jQuery tooltip element + */ + showCopied(promise, $tooltip) { + if (promise) { + promise.then(() => { + $tooltip.show(100); + setTimeout(() => $tooltip.hide(100), 1000); + }, (err) => { + console.error("error: ", err); + }); + } + }, }; // A simple tracker dependency that we invalidate every time the window is diff --git a/config/accounts.js b/config/accounts.js index b19c12b9d..de1d473b0 100644 --- a/config/accounts.js +++ b/config/accounts.js @@ -24,7 +24,7 @@ AccountsTemplates.addFields([ AccountsTemplates.configure({ defaultLayout: 'userFormsLayout', defaultContentRegion: 'content', - confirmPassword: false, + confirmPassword: true, enablePasswordChange: true, sendVerificationEmail: true, showForgotPasswordLink: true, diff --git a/config/query-classes.js b/config/query-classes.js index f86a0af21..32b0ff58e 100644 --- a/config/query-classes.js +++ b/config/query-classes.js @@ -514,6 +514,6 @@ export class Query { this.queryParams.text = text; // eslint-disable-next-line no-console - console.log('queryParams:', this.queryParams); + //console.log('queryParams:', this.queryParams); } } diff --git a/config/router.js b/config/router.js index 372f17c7e..a35883ee3 100644 --- a/config/router.js +++ b/config/router.js @@ -12,6 +12,8 @@ FlowRouter.route('/', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Filter.reset(); Session.set('sortBy', ''); @@ -34,6 +36,8 @@ FlowRouter.route('/public', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Filter.reset(); Session.set('sortBy', ''); @@ -56,6 +60,8 @@ FlowRouter.route('/b/:id/:slug', { const previousBoard = Session.get('currentBoard'); Session.set('currentBoard', currentBoard); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); // If we close a card, we'll execute again this route action but we don't // want to excape every current actions (filters, etc.) @@ -84,6 +90,8 @@ FlowRouter.route('/b/:boardId/:slug/:cardId', { Session.set('currentBoard', params.boardId); Session.set('currentCard', params.cardId); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Utils.manageCustomUI(); Utils.manageMatomo(); @@ -212,6 +220,8 @@ FlowRouter.route('/import/:source', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Session.set('importSource', params.source); Filter.reset(); @@ -232,6 +242,8 @@ FlowRouter.route('/setting', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Filter.reset(); Session.set('sortBy', ''); @@ -255,6 +267,8 @@ FlowRouter.route('/information', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Filter.reset(); Session.set('sortBy', ''); @@ -277,6 +291,8 @@ FlowRouter.route('/people', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Filter.reset(); Session.set('sortBy', ''); @@ -299,6 +315,8 @@ FlowRouter.route('/admin-reports', { Session.set('currentBoard', null); Session.set('currentList', null); Session.set('currentCard', null); + Session.set('popupCardId', null); + Session.set('popupCardBoardId', null); Filter.reset(); Session.set('sortBy', ''); diff --git a/docker-compose.yml b/docker-compose.yml index 1a7620087..caf7167a8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -111,6 +111,8 @@ services: expose: - 27017 volumes: + - /etc/localtime:/etc/localtime:ro + - /etc/timezone:/etc/timezone:ro - wekan-db:/data/db - wekan-db-dump:/dump @@ -158,7 +160,8 @@ services: - ROOT_URL=http://localhost # <=== using only at same laptop/desktop where Wekan is installed #--------------------------------------------------------------- # ==== EMAIL SETTINGS ==== - # Email settings are required in both MAIL_URL and Admin Panel, + # Email settings are only at MAIL_URL and MAIL_FROM. + # Admin Panel has test button, but it's not used for settings. # see https://github.com/wekan/wekan/wiki/Troubleshooting-Mail # For SSL in email, change smtp:// to smtps:// # NOTE: Special characters need to be url-encoded in MAIL_URL. @@ -166,6 +169,10 @@ services: #- MAIL_URL=smtp://user:pass@mailserver.example.com:25/ - MAIL_URL=smtp://:25/?ignoreTLS=true&tls={rejectUnauthorized:false} - MAIL_FROM=Wekan Notifications + # Currently MAIL_SERVICE is not in use. + #- MAIL_SERVICE=Outlook365 + #- MAIL_SERVICE_USER=firstname.lastname@hotmail.com + #- MAIL_SERVICE_PASSWORD=SecretPassword #--------------------------------------------------------------- # ==== OPTIONAL: MONGO OPLOG SETTINGS ===== # https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-378343587 @@ -229,6 +236,11 @@ services: #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 #--------------------------------------------------------------- + # ==== ACCOUNT OPTIONS ==== + # https://docs.meteor.com/api/accounts-multi.html#AccountsCommon-config + # Defaults below. Uncomment to change. wekan/server/accounts-common.js + # - ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 + #--------------------------------------------------------------- # ==== STORE ATTACHMENT ON SERVER FILESYSTEM INSTEAD OF MONGODB ==== # https://github.com/wekan/wekan/pull/2603 #- ATTACHMENTS_STORE_PATH = # pathname can be relative or fullpath @@ -654,6 +666,8 @@ services: #--------------------------------------------------------------------- depends_on: - wekandb + volumes: + - /etc/localtime:/etc/localtime:ro #--------------------------------------------------------------------------------- # ==== OPTIONAL: SHARE DATABASE TO OFFICE LAN AND REMOTE VPN ==== diff --git a/helm/wekan/Chart.yaml b/helm/wekan/Chart.yaml index 70602a107..0350a7b89 100644 --- a/helm/wekan/Chart.yaml +++ b/helm/wekan/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: "5.47" +appVersion: "5.85" dependencies: - condition: mongodb.enabled name: mongodb @@ -21,4 +21,4 @@ name: wekan sources: - https://github.com/wekan/wekan type: application -version: 1.1.0 +version: 1.1.1 diff --git a/helm/wekan/README.md b/helm/wekan/README.md index 38cb5fedd..3f11c784c 100644 --- a/helm/wekan/README.md +++ b/helm/wekan/README.md @@ -1,12 +1,38 @@ -# Helm Chart for Wekan +# WeKan ® - Open Source kanban + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```bash +helm repo add wekan https://wekan.github.io/charts +helm install my-release wekan/wekan +``` + +These commands deploy Wekan on the Kubernetes cluster in the default configuration. + +Tip: List all releases using `helm list` + +For all available values see `helm show values wekan/wekan`. + +## Uninstalling the Chart + +To uninstall/delete the my-release deployment: + +```bash +helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and +deletes the release. ## Features -o Uses a MongoDB replica set by default - this allows fault-tolerant +* Uses a MongoDB replica set by default - this allows fault-tolerant and scalable MongoDB deployment (or just set the replicas to 1 for a single server install) -o Optional Horizontal Pod Autoscaler (HPA), so that your Wekan pods +* Optional Horizontal Pod Autoscaler (HPA), so that your Wekan pods will scale automatically with increased CPU load. ## The configurable values (values.yaml) @@ -19,7 +45,9 @@ Scaling Wekan: replicaCount: 1 ``` -**replicaCount** Will set the initial number of replicas for the Wekan pod (and container) + +**replicaCount** will set the initial number of replicas for the Wekan pod +(and container) ```yaml ## Configure an horizontal pod autoscaler @@ -34,13 +62,17 @@ autoscaling: ## targetCPUUtilizationPercentage: 80 ``` -This section (if *enabled* is set to **true**) will enable the Kubernetes Horizontal Pod Autoscaler (HPA). -**minReplicas:** this is the minimum number of pods to scale down to (We recommend setting this to the same value as **replicaCount**). +This section (if *enabled* is set to **true**) will enable the Kubernetes +Horizontal Pod Autoscaler (HPA). + +**minReplicas:** this is the minimum number of pods to scale down to +(We recommend setting this to the same value as **replicaCount**). **maxReplicas:** this is the maximum number of pods to scale up to. -**targetCPUUtilizationPercentage:** This is the CPU at which the HPA will scale-out the number of Wekan pods. +**targetCPUUtilizationPercentage:** This is the CPU at which the HPA will +scale-out the number of Wekan pods. ```yaml mongodb-replicaset: @@ -55,11 +87,16 @@ mongodb-replicaset: This section controls the scale of the MongoDB redundant Replica Set. -**replicas:** This is the number of MongoDB instances to include in the set. You can set this to 1 for a single server - this will still allow you to scale-up later with a helm upgrade. +**replicas:** This is the number of MongoDB instances to include in the set. +You can set this to 1 for a single server - this will still allow you to +scale-up later with a helm upgrade. ### Install OCP route -If you use this chart to deploy Wekan on an OCP cluster, you can create route instead of ingress with following command: -``` bash -$ helm template --set route.enabled=true,ingress.enabled=false values.yaml . | oc apply -f- +If you use this chart to deploy Wekan on an OCP cluster, you can create route +instead of ingress with following command: + +```bash +helm template --set route.enabled=true,ingress.enabled=false values.yaml . | \ + oc apply -f- ``` diff --git a/helm/wekan/charts/.gitkeep b/helm/wekan/charts/.gitkeep deleted file mode 100644 index 8b1378917..000000000 --- a/helm/wekan/charts/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/helm/wekan/templates/deployment.yaml b/helm/wekan/templates/deployment.yaml index c7f192f1e..1f2834ea5 100644 --- a/helm/wekan/templates/deployment.yaml +++ b/helm/wekan/templates/deployment.yaml @@ -8,6 +8,9 @@ metadata: component: wekan release: {{ .Release.Name }} heritage: {{ .Release.Service }} + {{- if .Values.deploymentLabels }} + {{- toYaml .Values.deploymentLabels | nindent 4 }} + {{- end }} spec: replicas: {{ .Values.replicaCount }} selector: @@ -22,6 +25,9 @@ spec: app: {{ template "wekan.name" . }} component: wekan release: {{ .Release.Name }} + {{- if .Values.podLabels }} + {{- toYaml .Values.podLabels | nindent 8 }} + {{- end }} spec: serviceAccountName: {{ template "wekan.serviceAccountName" . }} containers: diff --git a/helm/wekan/templates/ingress.yaml b/helm/wekan/templates/ingress.yaml index 6904cdfa7..67ef37d32 100644 --- a/helm/wekan/templates/ingress.yaml +++ b/helm/wekan/templates/ingress.yaml @@ -2,7 +2,8 @@ {{- $fullName := include "wekan.fullname" . -}} {{- $servicePort := .Values.service.port -}} {{- $ingressPath := .Values.ingress.path -}} -apiVersion: networking.k8s.io/v1beta1 +{{- $ingressPathType := .Values.ingress.pathtype -}} +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ $fullName }} @@ -27,17 +28,17 @@ spec: secretName: {{ .secretName }} {{- end }} {{- end }} - backend: - serviceName: {{ $fullName }} - servicePort: 8080 rules: {{- range .Values.ingress.hosts }} - host: {{ . }} http: paths: - path: {{ $ingressPath }} + pathType: {{ $ingressPathType }} backend: - serviceName: {{ $fullName }} - servicePort: 8080 + service: + name: {{ $fullName }} + port: + number: 8080 {{- end }} {{- end }} diff --git a/helm/wekan/templates/tests/test-http.yaml b/helm/wekan/templates/tests/test-http.yaml new file mode 100644 index 000000000..2ed7e7518 --- /dev/null +++ b/helm/wekan/templates/tests/test-http.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ template "wekan.fullname" . }}-test-http" + labels: + app: {{ template "wekan.name" . }} + chart: {{ template "wekan.chart" . }} + component: wekan + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget', '-O', '/dev/stdout'] + args: ['{{ template "wekan.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/helm/wekan/values.yaml b/helm/wekan/values.yaml index 77dbb7d5b..dc0438144 100644 --- a/helm/wekan/values.yaml +++ b/helm/wekan/values.yaml @@ -14,7 +14,7 @@ serviceAccounts: ## image: repository: quay.io/wekan/wekan - tag: v5.47 + tag: v5.85 pullPolicy: IfNotPresent ## Configuration for wekan component @@ -56,6 +56,7 @@ ingress: # kubernetes.io/ingress.class: nginx # kubernetes.io/tls-acme: "true" path: /* + pathtype: ImplementationSpecific # This must match 'endpoint', unless your client supports different # hostnames. hosts: [ wekan.local ] @@ -103,6 +104,12 @@ autoscaling: ## targetCPUUtilizationPercentage: 80 +# Optional custom labels for the deployment resource. +deploymentLabels: {} + +# Optional custom labels for the pods created by the deployment. +podLabels: {} + # ------------------------------------------------------------------------------ # MongoDB: # ------------------------------------------------------------------------------ diff --git a/i18n/ar-EG.i18n.json b/i18n/ar-EG.i18n.json index 76864a1c4..6ba6343be 100644 --- a/i18n/ar-EG.i18n.json +++ b/i18n/ar-EG.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ar.i18n.json b/i18n/ar.i18n.json index 5f93b7c74..6995e05f5 100644 --- a/i18n/ar.i18n.json +++ b/i18n/ar.i18n.json @@ -96,6 +96,7 @@ "add-members": "إضافة أعضاء", "added": "أُضيف", "addMemberPopup-title": "الأعضاء", + "memberPopup-title": "أفضليات الأعضاء", "admin": "المدير", "admin-desc": "إمكانية مشاهدة و تعديل و حذف أعضاء ، و تعديل إعدادات اللوحة أيضا.", "admin-announcement": "إعلان", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other بطاقات", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "نقل الى الارشيف", "archive-all": "نقل الكل الى الارشيف", "archive-board": "نقل اللوح الى الارشيف", @@ -159,6 +161,8 @@ "card-delete-notice": "هذا حذف أبديّ . سوف تفقد كل الإجراءات المنوطة بهذه البطاقة", "card-delete-pop": "سيتم إزالة جميع الإجراءات من تبعات النشاط، وأنك لن تكون قادرا على إعادة فتح البطاقة. لا يوجد التراجع.", "card-delete-suggest-archive": "يمكنك نقل بطاقة إلى الأرشيف لإزالتها من اللوحة والمحافظة على النشاط.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "مستحق", "card-due-on": "مستحق في", "card-spent": "امضى وقتا", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "حذف البطاقة ?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "إجراءات على البطاقة", "cardLabelsPopup-title": "علامات", "cardMembersPopup-title": "أعضاء", @@ -268,14 +273,18 @@ "comment-placeholder": "أكتب تعليق", "comment-only": "التعليق فقط", "comment-only-desc": "يمكن التعليق على بطاقات فقط.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "حاسوب", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "نسخ رابط البطاقة إلى الحافظة", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "ربط البطاقة", "searchElementPopup-title": "بحث", "copyCardPopup-title": "نسخ البطاقة", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "تغيير تاريخ البدء", "editCardDueDatePopup-title": "تغيير تاريخ الاستحقاق", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "تعديل العلامة", "editNotificationPopup-title": "تصحيح الإشعار", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "نعم", "no": "لا", "accounts": "الحسابات", "accounts-allowEmailChange": "السماح بتغيير البريد الإلكتروني", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/bg.i18n.json b/i18n/bg.i18n.json index 014cbca3d..5059f15c4 100644 --- a/i18n/bg.i18n.json +++ b/i18n/bg.i18n.json @@ -96,6 +96,7 @@ "add-members": "Добави членове", "added": "Добавено", "addMemberPopup-title": "Членове", + "memberPopup-title": "Настройки на профила", "admin": "Администратор", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Съобщение", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "И __count__ други карти", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Премести в Архива", "archive-all": "Премести всички в Архива", "archive-board": "Премести Таблото в Архива", @@ -159,6 +161,8 @@ "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": "Можете да преместите картата в Архива, за да я премахнете от Таблото и така да запазите активността в него.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Готова за", "card-due-on": "Готова за", "card-spent": "Изработено време", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Желаете да изтриете картата?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Опции", "cardLabelsPopup-title": "Етикети", "cardMembersPopup-title": "Членове", @@ -268,14 +273,18 @@ "comment-placeholder": "Напиши коментар", "comment-only": "Само коментар", "comment-only-desc": "Може да коментира само в карти.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Няма коментари", "no-comments-desc": "Не може да вижда коментари и активност", "worker": "Работник", "worker-desc": "Може само да премества карти, да ги добавя към себе си и да коментира", "computer": "Компютър", "confirm-subtask-delete-dialog": "Сигурен ли сте, че искате да изтриете подзадачата?", - "confirm-checklist-delete-dialog": "Сигурни ли сте, че искате да изтриете този чеклист?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Копирай връзката на картата в клипборда", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Свържи картата", "searchElementPopup-title": "Търсене", "copyCardPopup-title": "Копирай картата", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Промени началната дата", "editCardDueDatePopup-title": "Промени датата за готовност", "editCustomFieldPopup-title": "Промени Полето", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Промени изработеното време", "editLabelPopup-title": "Промяна на Етикета", "editNotificationPopup-title": "Промени известията", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Експортиране на Табло", "exportCardPopup-title": "Export card", "sort": "Сортирай", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Add field to new cards", "always-field-on-card": "Add field to all cards", "showLabel-field-on-card": "Покажи име на поле на мини-картата", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Да", "no": "Не", "accounts": "Профили", "accounts-allowEmailChange": "Разреши промяна на имейла", "accounts-allowUserNameChange": "Позволи смяна на потребителско име", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Създаден на", "modifiedAt": "Modified at", "verified": "Потвърден", @@ -825,6 +840,7 @@ "error-undefined": "Нещо се обърка", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Копирай таблото", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Премахване", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/br.i18n.json b/i18n/br.i18n.json index e0e728fca..1998038c7 100644 --- a/i18n/br.i18n.json +++ b/i18n/br.i18n.json @@ -96,6 +96,7 @@ "add-members": "Ouzhpenn izili", "added": "Ouzhpennet", "addMemberPopup-title": "Izili", + "memberPopup-title": "Member Settings", "admin": "Merour", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Diverkañ ar gartenn ?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Izili", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ca.i18n.json b/i18n/ca.i18n.json index aae4661f7..ef468b610 100644 --- a/i18n/ca.i18n.json +++ b/i18n/ca.i18n.json @@ -96,6 +96,7 @@ "add-members": "Afegeix membres", "added": "Afegit", "addMemberPopup-title": "Membres", + "memberPopup-title": "Configura membres", "admin": "Administrador", "admin-desc": "Pots veure i editar fitxes, eliminar usuaris, i canviar la configuració del tauler.", "admin-announcement": "Alertes", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "apply": "Aplica", "app-is-offline": "Carregant. Per favor, espereu. Actualitzar la pàgina pot comportar pèrdua de dades. Si la càrrega no funciona, comproveu que el servidor no s'ha aturat. ", + "app-try-reconnect": "Try to reconnect.", "archive": "Moure al arxiu", "archive-all": "Moure tot al arxiu", "archive-board": "Moure Tauler al Arxiu", @@ -159,6 +161,8 @@ "card-delete-notice": "L'esborrat és permanent. Perdreu totes les accions associades a aquesta fitxa.", "card-delete-pop": "Totes les accions s'eliminaran de l'activitat i no podreu tornar a obrir la fitxa. No es pot desfer.", "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Finalitza", "card-due-on": "Finalitza a", "card-spent": "Temps Dedicat", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Esborrar fitxa?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Accions de fitxes", "cardLabelsPopup-title": "Etiquetes", "cardMembersPopup-title": "Membres", @@ -268,14 +273,18 @@ "comment-placeholder": "Escriu un comentari", "comment-only": "Només comentaris", "comment-only-desc": "Només pots fer comentaris a les fitxes", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Sense comentaris", "no-comments-desc": "Can not see comments and activities.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Ordinador", "confirm-subtask-delete-dialog": "Esteu segur que voleu eliminar la subtasca?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copia l'enllaç de la ftixa al porta-retalls", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Cerca", "copyCardPopup-title": "Copia la fitxa", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Canvia data d'inici", "editCardDueDatePopup-title": "Canvia data de finalització", "editCustomFieldPopup-title": "Modificar camp", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Canvia temps dedicat", "editLabelPopup-title": "Canvia etiqueta", "editNotificationPopup-title": "Edita la notificació", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exporta tauler", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Si", "no": "No", "accounts": "Comptes", "accounts-allowEmailChange": "Permet modificar correu electrònic", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Creat ", "modifiedAt": "Modified at", "verified": "Verificat", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/cs.i18n.json b/i18n/cs.i18n.json index 89d18f456..1fd6eb94a 100644 --- a/i18n/cs.i18n.json +++ b/i18n/cs.i18n.json @@ -96,6 +96,7 @@ "add-members": "Přidat členy", "added": "Přidán", "addMemberPopup-title": "Členové", + "memberPopup-title": "Nastavení uživatele", "admin": "Administrátor", "admin-desc": "Může zobrazovat a upravovat karty, mazat členy a měnit nastavení tabla.", "admin-announcement": "Oznámení", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "A __count__ dalších karet", "apply": "Použít", "app-is-offline": "Načítá se, prosím čekejte. Obnovení stránky způsobí ztrátu dat. Pokud se načítání nedaří, zkontrolujte prosím server.", + "app-try-reconnect": "Try to reconnect.", "archive": "Přesunout do archivu", "archive-all": "Přesunout vše do archivu", "archive-board": "Přesunout tablo do archivu", @@ -159,6 +161,8 @@ "card-delete-notice": "Smazání je trvalé. Přijdete o všechny akce asociované s touto kartou.", "card-delete-pop": "Všechny akce budou odstraněny z kanálu aktivity a nebude možné kartu obnovit. Toto nelze vrátit zpět.", "card-delete-suggest-archive": "Můžete přesunout kartu do archivu pro odstranění z tabla a zachovat aktivitu.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Termín", "card-due-on": "Do", "card-spent": "Strávený čas", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Smazat plánovací poker?", "poker-delete-pop": "Smazání je trvalé. Přijdete o všechny akce asociované s tímto plánovacím pokerem.", "cardDeletePopup-title": "Smazat kartu?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Akce karty", "cardLabelsPopup-title": "Štítky", "cardMembersPopup-title": "Členové", @@ -268,14 +273,18 @@ "comment-placeholder": "Text komentáře", "comment-only": "Pouze komentáře", "comment-only-desc": "Může přidávat komentáře pouze do karet.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Žádné komentáře", "no-comments-desc": "Nemůže vidět komentáře a aktivity", "worker": "Pracovník", "worker-desc": "Je možné pouze přesouvat karty, přiřazovat ke kartám a komentovat.", "computer": "Počítač", "confirm-subtask-delete-dialog": "Opravdu chcete smazat tento podúkol?", - "confirm-checklist-delete-dialog": "Opravdu chcete smazat tento checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopírovat adresu karty do mezipaměti", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Propojit kartu", "searchElementPopup-title": "Hledat", "copyCardPopup-title": "Kopírovat kartu", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Změnit datum startu úkolu", "editCardDueDatePopup-title": "Změnit datum dokončení úkolu", "editCustomFieldPopup-title": "Upravit pole", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Změnit strávený čas", "editLabelPopup-title": "Změnit štítek", "editNotificationPopup-title": "Změnit notifikace", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportovat tablo", "exportCardPopup-title": "Exportovat kartu", "sort": "řadit", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Kliknout pro třídění seznamu", "list-sort-by": "řadit seznam podle", "list-label-modifiedAt": "Čas posledního přístupu", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Přidat pole na nové karty", "always-field-on-card": "Přidat pole na všechny karty", "showLabel-field-on-card": "Ukázat štítek pole na minikartě", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Ano", "no": "Ne", "accounts": "Účty", "accounts-allowEmailChange": "Povolit změnu Emailu", "accounts-allowUserNameChange": "Povolit změnu uživatelského jména", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Vytvořeno v", "modifiedAt": "Modifikováno", "verified": "Ověřen", @@ -825,6 +840,7 @@ "error-undefined": "Něco se pokazilo", "error-ldap-login": "Během přihlašování nastala chyba", "display-authentication-method": "Zobraz způsob ověřování", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Zobraz způsob ověřování", "duplicate-board": "Duplikovat tablo", "org-number": "Počet organizací je:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximalizovat kartu", "minimize-card": "Minimalizovat kartu", "delete-org-warning-message": "Tuto organizaci není možné smazat, protože do ní patří uživatel(é)", - "delete-team-warning-message": "Tento tým není možné smazat, protože do nej patří uživatel(é)" + "delete-team-warning-message": "Tento tým není možné smazat, protože do nej patří uživatel(é)", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Odstranit", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/da.i18n.json b/i18n/da.i18n.json index 223628316..1028c2890 100644 --- a/i18n/da.i18n.json +++ b/i18n/da.i18n.json @@ -96,6 +96,7 @@ "add-members": "Tilføj medlemmer", "added": "Tilføjet", "addMemberPopup-title": "Medlemmer", + "memberPopup-title": "Medlemsindstillinger", "admin": "Admin", "admin-desc": "Kan se og redigere kort, fjerne medlemmer og ændre indstillinger for tavlen.", "admin-announcement": "Annoncering", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Samt __count__ andre kort", "apply": "Anvend", "app-is-offline": "Indlæser, vent venligst. Genopfriskes siden er der risiko for tab af data. Fungerer indlæsningen ikke, så tjek venligst om serveren er stoppet. ", + "app-try-reconnect": "Try to reconnect.", "archive": "Flyt til arkiv", "archive-all": "Flyt alle til arkiv", "archive-board": "Flyt tavle til arkiv", @@ -159,6 +161,8 @@ "card-delete-notice": "Sletning vil være permanent. Du mister alle handlinger knyttet til dette kort.", "card-delete-pop": "Alle handlinger vil blive fjernet fra aktivitetsfeedet, og du kan ikke genåbne kortet. Det kan ikke omgøres.", "card-delete-suggest-archive": "Du kan flytte et kort til arkivet for at fjerne det fra tavlen, og bevare aktiviteten.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Forfalder", "card-due-on": "Forfaldsdato", "card-spent": "Anvendt tid", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Slet kort?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Handlinger for kort", "cardLabelsPopup-title": "Etiketter", "cardMembersPopup-title": "Medlemmer", @@ -268,14 +273,18 @@ "comment-placeholder": "Skriv kommentar", "comment-only": "Kun kommentarer", "comment-only-desc": "Kan kun kommentere på kort.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Ingen kommentarer", "no-comments-desc": "Kan ikke se kommentarer og aktiviteter.", "worker": "Arbejder", "worker-desc": "Kan kun flytte kort, tildele sig selv til kort og kommentere.", "computer": "Computer", "confirm-subtask-delete-dialog": "Er du sikker på du vil slette delopgaven?", - "confirm-checklist-delete-dialog": "Er du sikker på du vil slette tjeklisten?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopiér link til kort til udklipsholder ", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Sammenkæd kort", "searchElementPopup-title": "Søg", "copyCardPopup-title": "Kopiér kort", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Skift startdato", "editCardDueDatePopup-title": "Skift forfaldsdato", "editCustomFieldPopup-title": "Redigér felt", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Tilpas forbrugt tid", "editLabelPopup-title": "Skift etikette", "editNotificationPopup-title": "Redigér notifikation", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Eksportér tavle", "exportCardPopup-title": "Export card", "sort": "Sortér", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Klik for at sortere listen", "list-sort-by": "Sortér listen efter:", "list-label-modifiedAt": "Senest tilgået:", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Add field to new cards", "always-field-on-card": "Add field to all cards", "showLabel-field-on-card": "Vis feltetikette på minikort", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Ja", "no": "Nej", "accounts": "Konti", "accounts-allowEmailChange": "Tillad ændring af e-mail", "accounts-allowUserNameChange": "Tillad ændring af brugernavn", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Oprettet per", "modifiedAt": "Modified at", "verified": "Verificeret", @@ -825,6 +840,7 @@ "error-undefined": "Noget gik galt", "error-ldap-login": "Fejl under forsøg på login", "display-authentication-method": "Vis godkendelsesmetode", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Standard for godkendelsesmetode", "duplicate-board": "Duplikér tavle", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Fjern", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/de-AT.i18n.json b/i18n/de-AT.i18n.json new file mode 100644 index 000000000..cc358ec8f --- /dev/null +++ b/i18n/de-AT.i18n.json @@ -0,0 +1,1129 @@ +{ + "accept": "Akzeptieren", + "act-activity-notify": "Aktivitätsbenachrichtigung", + "act-addAttachment": "hat Anhang __attachment__ zur Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-deleteAttachment": "hat Anhang __attachment__ von Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ gelöscht", + "act-addSubtask": "hat Teilaufgabe __subtask__ zur Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-addLabel": "hat Label __label__ zur Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-addedLabel": "hat Label __label__ zur Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-removeLabel": "hat Label __label__ von Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ entfernt", + "act-removedLabel": "hat Label __label__ von Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ entfernt", + "act-addChecklist": "hat Checkliste __checklist__ zur Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-addChecklistItem": "hat Checklistenposition __checklistItem__ zu Checkliste __checkList__ auf der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-removeChecklist": "hat Checkliste __checklist__ von Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ entfernt", + "act-removeChecklistItem": "hat Checklistenposition __checklistItem__ von Checkliste __checkList__ auf der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ entfernt", + "act-checkedItem": "hat __checklistItem__ der Checkliste __checklist__ der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ abgehakt", + "act-uncheckedItem": "hat Haken von __checklistItem__ der Checkliste __checklist__ der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ entfernt", + "act-completeChecklist": "hat Checkliste __checklist__ der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ vervollständigt", + "act-uncompleteChecklist": "hat Checkliste __checklist__ der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ unvervollständigt", + "act-addComment": "hat Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ kommentiert: __comment__", + "act-editComment": "hat den Kommentar auf Karte __card__: __comment__ auf Liste __list__ in Swimlane __swimlane__ in Board __board__ bearbeitet", + "act-deleteComment": "hat den Kommentar von Karte __card__: __comment__ auf Liste __list__ in Swimlane __swimlane__ in Board __board__ gelöscht", + "act-createBoard": "hat Board __board__ erstellt", + "act-createSwimlane": "hat Swimlane __swimlane__ in Board __board__ erstellt", + "act-createCard": "hat Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ erstellt", + "act-createCustomField": "hat benutzerdefiniertes Feld __customField__ in Board __board__ angelegt", + "act-deleteCustomField": "hat benutzerdefiniertes Feld __customField__ in Board __board__ gelöscht", + "act-setCustomField": "hat benutzerdefiniertes Feld __customField__: __customFieldValue__ auf Karte __card__ auf Liste __list__ in Swimlane __swimlane__ in Board __board__ bearbeitet", + "act-createList": "hat Liste __list__ zu Board __board__ hinzugefügt", + "act-addBoardMember": "hat Mitglied __member__ zu Board __board__ hinzugefügt", + "act-archivedBoard": "hat Board __board__ ins Archiv verschoben", + "act-archivedCard": "hat Karte __card__ von der Liste __list__ in Swimlane __swimlane__ in Board __board__ ins Archiv verschoben", + "act-archivedList": "hat Liste __list__ in Swimlane __swimlane__ in Board __board__ ins Archiv verschoben", + "act-archivedSwimlane": "hat Swimlane __swimlane__ von Board __board__ ins Archiv verschoben", + "act-importBoard": "hat Board __board__ importiert", + "act-importCard": "hat Karte __card__ in Liste __list__ in Swimlane __swimlane__ in Board __board__ importiert", + "act-importList": "hat Liste __list__ in Swimlane __swimlane__ in Board __board__ importiert", + "act-joinMember": "hat Mitglied __member__ zur Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ hinzugefügt", + "act-moveCard": "hat Karte __card__ in Board __board__ von Liste __oldList__ in Swimlane __oldSwimlane__ zu Liste __list__ in Swimlane __swimlane__ verschoben", + "act-moveCardToOtherBoard": "hat Karte __card__ von Liste __oldList__ in Swimlane __oldSwimlane__ in Board __oldBoard__ zu Liste __list__ in Swimlane __swimlane__ in Board __board__ verschoben", + "act-removeBoardMember": "hat Mitglied __member__ von Board __board__ entfernt", + "act-restoredCard": "hat Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ wiederhergestellt", + "act-unjoinMember": "hat Mitglied __member__ von Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ entfernt", + "act-withBoardTitle": "__board__", + "act-withCardTitle": "[__board__] __card__", + "actions": "Aktionen", + "activities": "Aktivitäten", + "activity": "Aktivität", + "activity-added": "hat %s zu %s hinzugefügt", + "activity-archived": "hat %s ins Archiv verschoben", + "activity-attached": "hat %s an %s angehängt", + "activity-created": "hat %s erstellt", + "activity-customfield-created": "hat das benutzerdefinierte Feld %s erstellt", + "activity-excluded": "hat %s von %s ausgeschlossen", + "activity-imported": "hat %s in %s von %s importiert", + "activity-imported-board": "hat %s von %s importiert", + "activity-joined": "ist %s beigetreten", + "activity-moved": "hat %s von %s nach %s verschoben", + "activity-on": "in %s", + "activity-removed": "hat %s von %s entfernt", + "activity-sent": "hat %s an %s gesendet", + "activity-unjoined": "hat %s verlassen", + "activity-subtask-added": "Teilaufgabe zu %s hinzugefügt", + "activity-checked-item": "markierte %s in Checkliste %s von %s", + "activity-unchecked-item": "hat %s in Checkliste %s von %s abgewählt", + "activity-checklist-added": "hat eine Checkliste zu %s hinzugefügt", + "activity-checklist-removed": "entfernte eine Checkliste von %s", + "activity-checklist-completed": "Abgeschlossene Checkliste", + "activity-checklist-uncompleted": "unvervollständigte die Checkliste %s von %s", + "activity-checklist-item-added": "hat ein Checklistenelement zu '%s' in %s hinzugefügt", + "activity-checklist-item-removed": "hat ein Checklistenelement von '%s' in %s entfernt", + "add": "Hinzufügen", + "activity-checked-item-card": "markiere %s in Checkliste %s", + "activity-unchecked-item-card": "hat %s in Checkliste %s abgewählt", + "activity-checklist-completed-card": "hat Checkliste __checklist__ der Karte __card__ auf der Liste __list__ in Swimlane __swimlane__ in Board __board__ vervollständigt", + "activity-checklist-uncompleted-card": "unvervollständigte die Checkliste %s", + "activity-editComment": "editierte Kommentar %s", + "activity-deleteComment": "löschte Kommentar %s", + "activity-receivedDate": "hat Empfangsdatum zu %s geändert auf %s", + "activity-startDate": "hat Startdatum zu %s geändert auf %s", + "activity-dueDate": "hat Fälligkeitsdatum zu %s geändert auf %s", + "activity-endDate": "hat Enddatum zu %s geändert auf %s", + "add-attachment": "Datei anhängen", + "add-board": "neues Board", + "add-template": "Vorlage hinzufügen", + "add-card": "Karte hinzufügen", + "add-card-to-top-of-list": "Karte am Anfang der Liste hinzufügen", + "add-card-to-bottom-of-list": "Karte am Ende der Liste hinzufügen", + "add-swimlane": "Swimlane hinzufügen", + "add-subtask": "Teilaufgabe hinzufügen", + "add-checklist": "Checkliste hinzufügen", + "add-checklist-item": "Element zu Checkliste hinzufügen", + "convertChecklistItemToCardPopup-title": "Zu Karte umwandeln", + "add-cover": "Cover hinzufügen", + "add-label": "Label hinzufügen", + "add-list": "Liste hinzufügen", + "add-members": "Mitglieder hinzufügen", + "added": "Hinzugefügt", + "addMemberPopup-title": "Mitglieder", + "memberPopup-title": "Nutzereinstellungen", + "admin": "Admin", + "admin-desc": "Kann Karten anzeigen und bearbeiten, Mitglieder entfernen und Boardeinstellungen ändern.", + "admin-announcement": "Ankündigung", + "admin-announcement-active": "Aktive systemweite Ankündigungen", + "admin-announcement-title": "Ankündigung des Administrators", + "all-boards": "Alle Boards", + "and-n-other-card": "und eine andere Karte", + "and-n-other-card_plural": "und __count__ andere Karten", + "apply": "Übernehmen", + "app-is-offline": "Laden, bitte warten. Das Aktualisieren der Seite führt zu Datenverlust. Wenn das Laden nicht funktioniert, überprüfen Sie bitte, ob der Server nicht angehalten wurde.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Ins Archiv verschieben", + "archive-all": "Alles ins Archiv verschieben", + "archive-board": "Board ins Archiv verschieben", + "archive-card": "Karte ins Archiv verschieben", + "archive-list": "Liste ins Archiv verschieben", + "archive-swimlane": "Swimlane ins Archiv verschieben", + "archive-selection": "Auswahl ins Archiv verschieben", + "archiveBoardPopup-title": "Board ins Archiv verschieben?", + "archived-items": "Archiv", + "archived-boards": "Boards im Archiv", + "restore-board": "Board wiederherstellen", + "no-archived-boards": "Keine Boards im Archiv.", + "archives": "Archiv", + "template": "Vorlage", + "templates": "Vorlagen", + "template-container": "Vorlagen-Container", + "add-template-container": "Vorlagen-Container hinzufügen", + "assign-member": "Mitglied zuweisen", + "attached": "angehängt", + "attachment": "Anhang", + "attachment-delete-pop": "Das Löschen eines Anhangs kann nicht rückgängig gemacht werden.", + "attachmentDeletePopup-title": "Anhang löschen?", + "attachments": "Anhänge", + "auto-watch": "Neue Boards nach Erstellung automatisch beobachten", + "avatar-too-big": "Das Profilbild ist zu groß (520KB max)", + "back": "Zurück", + "board-change-color": "Farbe ändern", + "board-nb-stars": "%s Sterne", + "board-not-found": "Board nicht gefunden", + "board-private-info": "Dieses Board wird privat sein.", + "board-public-info": "Dieses Board wird öffentlich sein.", + "board-drag-drop-reorder-or-click-open": "Benutze Drag-and-Drop, um Board-Icons neu anzuordnen. Klicke auf ein Board-Icon, um das Board zu öffnen.", + "boardChangeColorPopup-title": "Farbe des Boards ändern", + "boardChangeTitlePopup-title": "Board umbenennen", + "boardChangeVisibilityPopup-title": "Sichtbarkeit ändern", + "boardChangeWatchPopup-title": "Beobachtung ändern", + "boardMenuPopup-title": "Boardeinstellungen", + "boardChangeViewPopup-title": "Boardansicht", + "boards": "Boards", + "board-view": "Boardansicht", + "board-view-cal": "Kalender", + "board-view-swimlanes": "Swimlanes", + "board-view-collapse": "Einklappen", + "board-view-gantt": "Gantt", + "board-view-lists": "Listen", + "bucket-example": "z.B. \"Löffelliste\"", + "cancel": "Abbrechen", + "card-archived": "Diese Karte wurde ins Archiv verschoben", + "board-archived": "Dieses Board wurde ins Archiv verschoben.", + "card-comments-title": "Diese Karte hat %s Kommentar(e).", + "card-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Alle Aktionen, die dieser Karte zugeordnet sind, werden ebenfalls gelöscht.", + "card-delete-pop": "Alle Aktionen werden aus dem Aktivitätsfeed entfernt und die Karte kann nicht wiedereröffnet werden. Die Aktion kann nicht rückgängig gemacht werden.", + "card-delete-suggest-archive": "Sie können eine Karte ins Archiv verschieben, um sie vom Board zu entfernen und die Aktivitäten zu behalten.", + "card-archive-pop": "Die Karte wird nach ihrer Archivierung nicht in dieser Liste sichtbar sein.", + "card-archive-suggest-cancel": "Sie können die Karte später aus dem Archiv wiederherstellen.", + "card-due": "Fällig", + "card-due-on": "Fällig am", + "card-spent": "Aufgewendete Zeit", + "card-edit-attachments": "Anhänge ändern", + "card-edit-custom-fields": "Benutzerdefinierte Felder editieren", + "card-edit-labels": "Labels ändern", + "card-edit-members": "Mitglieder ändern", + "card-labels-title": "Labels für diese Karte ändern.", + "card-members-title": "Der Karte Board-Mitglieder hinzufügen oder entfernen.", + "card-start": "Start", + "card-start-on": "Start am", + "cardAttachmentsPopup-title": "Anhängen von", + "cardCustomField-datePopup-title": "Datum ändern", + "cardCustomFieldsPopup-title": "Benutzerdefinierte Felder editieren", + "cardStartVotingPopup-title": "Abstimmung starten", + "positiveVoteMembersPopup-title": "Befürworter", + "negativeVoteMembersPopup-title": "Gegner", + "card-edit-voting": "Abstimmung editieren", + "editVoteEndDatePopup-title": "Enddatum der Abstimmung ändern", + "allowNonBoardMembers": "Alle eingeloggte Nutzer erlauben", + "vote-question": "Abstimmen über", + "vote-public": "Zeigen, wer was gewählt hat", + "vote-for-it": "Dafür", + "vote-against": "Dagegen", + "deleteVotePopup-title": "Wahl löschen?", + "vote-delete-pop": "Löschen ist unwiderruflich. Alle Aktionen die dieser Karte zugeordnet sind werden ebenfalls gelöscht.", + "cardStartPlanningPokerPopup-title": "Planungspoker starten", + "card-edit-planning-poker": "Planungspoker ändern", + "editPokerEndDatePopup-title": "Enddatum für Planungspoker-Stimme ändern", + "poker-question": "Planungspoker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Beenden", + "poker-result-votes": "Werte", + "poker-result-who": "Wer", + "poker-replay": "Wiederholen", + "set-estimation": "Schätzung vornehmen", + "deletePokerPopup-title": "Planungspoker löschen?", + "poker-delete-pop": "Die Löschung ist permanent. Sie werden alles im Zusammenhang mit diesem Planungspoker verlieren.", + "cardDeletePopup-title": "Karte löschen?", + "cardArchivePopup-title": "Karte archivieren?", + "cardDetailsActionsPopup-title": "Kartenaktionen", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Mitglieder", + "cardMorePopup-title": "Mehr", + "cardTemplatePopup-title": "Vorlage erstellen", + "cards": "Karten", + "cards-count": "Karten", + "cards-count-one": "Karte", + "casSignIn": "Mit CAS anmelden", + "cardType-card": "Karte", + "cardType-linkedCard": "Verknüpfte Karte", + "cardType-linkedBoard": "Verknüpftes Board", + "change": "Ändern", + "change-avatar": "Profilbild ändern", + "change-password": "Passwort ändern", + "change-permissions": "Berechtigungen ändern", + "change-settings": "Einstellungen ändern", + "changeAvatarPopup-title": "Profilbild ändern", + "changeLanguagePopup-title": "Sprache ändern", + "changePasswordPopup-title": "Passwort ändern", + "changePermissionsPopup-title": "Berechtigungen ändern", + "changeSettingsPopup-title": "Einstellungen ändern", + "subtasks": "Teilaufgaben", + "checklists": "Checklisten", + "click-to-star": "Klicken Sie, um das Board mit einem Stern zu markieren.", + "click-to-unstar": "Klicken Sie, um den Stern vom Board zu entfernen.", + "clipboard": "Zwischenablage oder Drag & Drop", + "close": "Schließen", + "close-board": "Board schließen", + "close-board-pop": "Sie können das Board wiederherstellen, indem Sie die Schaltfläche \"Archiv\" in der Kopfzeile der Startseite anklicken.", + "close-card": "Karte schließen", + "color-black": "schwarz", + "color-blue": "blau", + "color-crimson": "Karminrot", + "color-darkgreen": "Dunkelgrün", + "color-gold": "Gold", + "color-gray": "Grau", + "color-green": "grün", + "color-indigo": "Indigo", + "color-lime": "hellgrün", + "color-magenta": "Magentarot", + "color-mistyrose": "Altrosa", + "color-navy": "Marineblau", + "color-orange": "orange", + "color-paleturquoise": "Blasses Türkis", + "color-peachpuff": "Pfirsich", + "color-pink": "pink", + "color-plum": "Pflaume", + "color-purple": "lila", + "color-red": "rot", + "color-saddlebrown": "Sattelbraun", + "color-silver": "Silber", + "color-sky": "himmelblau", + "color-slateblue": "Schieferblau", + "color-white": "Weiß", + "color-yellow": "gelb", + "unset-color": "Nicht festgelegt", + "comment": "Kommentar", + "comment-placeholder": "Kommentar schreiben", + "comment-only": "Nur Kommentare", + "comment-only-desc": "Kann Karten nur kommentieren.", + "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen wollen?", + "deleteCommentPopup-title": "Kommentar löschen?", + "no-comments": "Keine Kommentare", + "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", + "worker": "Arbeiter", + "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", + "computer": "Computer", + "confirm-subtask-delete-dialog": "Wollen Sie die Teilaufgabe wirklich löschen?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "Karte verknüpfen", + "searchElementPopup-title": "Suche", + "copyCardPopup-title": "Karte kopieren", + "copyChecklistToManyCardsPopup-title": "Checklistenvorlage in mehrere Karten kopieren", + "copyChecklistToManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format", + "copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]", + "create": "Erstellen", + "createBoardPopup-title": "Board erstellen", + "chooseBoardSourcePopup-title": "Board importieren", + "createLabelPopup-title": "Label erstellen", + "createCustomField": "Feld erstellen", + "createCustomFieldPopup-title": "Feld erstellen", + "current": "aktuell", + "custom-field-delete-pop": "Dies wird das Feld aus allen Karten entfernen und den dazugehörigen Verlauf löschen. Die Aktion kann nicht rückgängig gemacht werden.", + "custom-field-checkbox": "Kontrollkästchen", + "custom-field-currency": "Währung", + "custom-field-currency-option": "Währungszeichen", + "custom-field-date": "Datum", + "custom-field-dropdown": "Dropdownliste", + "custom-field-dropdown-none": "(keiner)", + "custom-field-dropdown-options": "Listenoptionen", + "custom-field-dropdown-options-placeholder": "Drücken Sie die Eingabetaste, um weitere Optionen hinzuzufügen", + "custom-field-dropdown-unknown": "(unbekannt)", + "custom-field-number": "Zahl", + "custom-field-text": "Text", + "custom-fields": "Benutzerdefinierte Felder", + "date": "Datum", + "decline": "Ablehnen", + "default-avatar": "Standard Profilbild", + "delete": "Löschen", + "deleteCustomFieldPopup-title": "Benutzerdefiniertes Feld löschen?", + "deleteLabelPopup-title": "Label löschen?", + "description": "Beschreibung", + "disambiguateMultiLabelPopup-title": "Labels vereinheitlichen", + "disambiguateMultiMemberPopup-title": "Mitglieder vereinheitlichen", + "discard": "Verwerfen", + "done": "Erledigt", + "download": "Herunterladen", + "edit": "Bearbeiten", + "edit-avatar": "Profilbild ändern", + "edit-profile": "Profil ändern", + "edit-wip-limit": "WIP-Limit bearbeiten", + "soft-wip-limit": "Soft WIP-Limit", + "editCardStartDatePopup-title": "Startdatum ändern", + "editCardDueDatePopup-title": "Fälligkeitsdatum ändern", + "editCustomFieldPopup-title": "Feld bearbeiten", + "addReactionPopup-title": "Reaktion hinzufügen", + "editCardSpentTimePopup-title": "Aufgewendete Zeit ändern", + "editLabelPopup-title": "Label ändern", + "editNotificationPopup-title": "Benachrichtigung ändern", + "editProfilePopup-title": "Profil ändern", + "email": "E-Mail", + "email-enrollAccount-subject": "Ihr Benutzerkonto auf __siteName__ wurde erstellt", + "email-enrollAccount-text": "Hallo __user__,\n\num den Dienst nutzen zu können, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.", + "email-fail": "Senden der E-Mail fehlgeschlagen", + "email-fail-text": "Fehler beim Senden der E-Mail", + "email-invalid": "Ungültige E-Mail-Adresse", + "email-invite": "per E-Mail einladen", + "email-invite-subject": "__inviter__ hat Ihnen eine Einladung geschickt", + "email-invite-text": "Hallo __user__,\n\n__inviter__ hat Sie zu dem Board \"__board__\" eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n\n__url__\n\nDanke.", + "email-resetPassword-subject": "Setzten Sie ihr Passwort auf __siteName__ zurück", + "email-resetPassword-text": "Hallo __user__,\n\num ihr Passwort zurückzusetzen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.", + "email-sent": "E-Mail gesendet", + "email-verifyEmail-subject": "Bestätigen Sie ihre E-Mail-Adresse auf __siteName__", + "email-verifyEmail-text": "Hallo __user__,\n\num ihre E-Mail-Adresse zu bestätigen, klicken Sie bitte auf folgenden Link:\n\n__url__\n\nDanke.", + "enable-wip-limit": "WIP-Limit einschalten", + "error-board-doesNotExist": "Dieses Board existiert nicht", + "error-board-notAdmin": "Um das zu tun, müssen Sie Administrator dieses Boards sein", + "error-board-notAMember": "Um das zu tun, müssen Sie Mitglied dieses Boards sein", + "error-json-malformed": "Ihre Eingabe ist kein gültiges JSON", + "error-json-schema": "Ihre JSON-Daten enthalten nicht die gewünschten Informationen im richtigen Format", + "error-csv-schema": "hre CSV (Comma Separated Values)/TSV (Tab Separated Values) enthalten nicht die gewünschten Informationen im richtigen Format", + "error-list-doesNotExist": "Diese Liste existiert nicht", + "error-user-doesNotExist": "Dieser Nutzer existiert nicht", + "error-user-notAllowSelf": "Sie können sich nicht selbst einladen.", + "error-user-notCreated": "Dieser Nutzer ist nicht angelegt", + "error-username-taken": "Dieser Benutzername ist bereits vergeben", + "error-orgname-taken": "Dieser Organisationsname ist schon vergeben", + "error-teamname-taken": "Dieser Teamname ist schon vergeben", + "error-email-taken": "E-Mail wird schon verwendet", + "export-board": "Board exportieren", + "export-board-json": "Board als JSON exportieren", + "export-board-csv": "Board als CSV exportieren", + "export-board-tsv": "Board als TSV exportieren", + "export-board-excel": "Board nach Excel exportieren", + "user-can-not-export-excel": "Benutzer kann nicht nach Excel exportieren", + "export-board-html": "Board als HTML exportieren", + "export-card": "Karte exportieren", + "export-card-pdf": "Karte in ein PDF exportieren", + "user-can-not-export-card-to-pdf": "Benutzer kann Karte nicht in ein PDF exportieren", + "exportBoardPopup-title": "Board exportieren", + "exportCardPopup-title": "Karte exportieren", + "sort": "Sortieren", + "sorted": "Sortiert", + "remove-sort": "Sortierung entfernen", + "sort-desc": "Zum Sortieren der Liste klicken", + "list-sort-by": "Sortieren der Liste nach:", + "list-label-modifiedAt": "Letzte Zugriffszeit", + "list-label-title": "Name der Liste", + "list-label-sort": "Ihre manuelle Sortierung", + "list-label-short-modifiedAt": "(Z)", + "list-label-short-title": "(N)", + "list-label-short-sort": "(M)", + "filter": "Filter", + "filter-cards": "Karten oder Listen filtern", + "filter-dates-label": "Nach Datum filtern", + "filter-no-due-date": "Kein Fälligkeitsdatum", + "filter-overdue": "Überfällig", + "filter-due-today": "Heute fällig", + "filter-due-this-week": "Diese Woche fällig", + "filter-due-tomorrow": "Morgen fällig", + "list-filter-label": "Liste nach Titel filtern", + "filter-clear": "Filter entfernen", + "filter-labels-label": "Nach Label filtern", + "filter-no-label": "Kein Label", + "filter-member-label": "Nach Nutzer filtern", + "filter-no-member": "Kein Mitglied", + "filter-assignee-label": "Nach Zuordnung filtern", + "filter-no-assignee": "Nicht zugewiesen", + "filter-custom-fields-label": "Filtern nach benutzerdefinierten Feldern", + "filter-no-custom-fields": "Keine benutzerdefinierten Felder", + "filter-show-archive": "Archivierte Listen anzeigen", + "filter-hide-empty": "Leere Listen verstecken", + "filter-on": "Filter ist aktiv", + "filter-on-desc": "Sie filtern die Karten in diesem Board. Klicken Sie, um den Filter zu bearbeiten.", + "filter-to-selection": "Ergebnisse auswählen", + "other-filters-label": "Andere Filter", + "advanced-filter-label": "Erweiterter Filter", + "advanced-filter-description": "Der erweiterte Filter erlaubt die Eingabe von Zeichenfolgen, die folgende Operatoren enthalten: == != <= >= && || ( ). Ein Leerzeichen wird als Trennzeichen zwischen den Operatoren verwendet. Sie können nach allen benutzerdefinierten Feldern filtern, indem Sie deren Namen und Werte eingeben. Zum Beispiel: Feld1 == Wert1. Hinweis: Wenn Felder oder Werte Leerzeichen enthalten, müssen Sie sie in einfache Anführungszeichen setzen. Zum Beispiel: 'Feld 1' == 'Wert 1'. Um einzelne Steuerzeichen (' \\/) zu überspringen, können Sie \\ verwenden. Zum Beispiel: Feld1 == Ich bin\\'s. Sie können außerdem mehrere Bedingungen kombinieren. Zum Beispiel: F1 == W1 || F1 == W2. Normalerweise werden alle Operatoren von links nach rechts interpretiert. Sie können die Reihenfolge ändern, indem Sie Klammern setzen. Zum Beispiel: F1 == W1 && ( F2 == W2 || F2 == W3 ). Sie können Textfelder auch mithilfe regulärer Ausdrücke durchsuchen: F1 == /Tes.*/i", + "fullname": "Vollständiger Name", + "header-logo-title": "Zurück zur Board Seite.", + "hide-system-messages": "Systemmeldungen ausblenden", + "headerBarCreateBoardPopup-title": "Board erstellen", + "home": "Home", + "import": "Importieren", + "impersonate-user": "als Benutzer ausgeben", + "link": "Verknüpfung", + "import-board": "Board importieren", + "import-board-c": "Board importieren", + "import-board-title-trello": "Board von Trello importieren", + "import-board-title-wekan": "Board aus vorherigem Export importieren", + "import-board-title-csv": "Board von CSV/TSV importieren", + "from-trello": "Von Trello", + "from-wekan": "Aus vorherigem Export", + "from-csv": "Aus CSV/TSV", + "import-board-instruction-trello": "Gehen Sie in ihrem Trello-Board auf 'Menü', dann 'Mehr', 'Drucken und Exportieren', 'JSON-Export' und kopieren Sie den dort angezeigten Text", + "import-board-instruction-csv": "Fügen Sie die Ihre Comma-Separated- (CSV) / bzw. Tab-Separated-Values (TSV) ein.", + "import-board-instruction-wekan": "Gehen Sie in Ihrem Board auf 'Menü', danach auf 'Board exportieren' und kopieren Sie den Text aus der heruntergeladenen Datei.", + "import-board-instruction-about-errors": "Treten beim importieren eines Board Fehler auf, so kann der Import dennoch erfolgreich abgeschlossen sein und das Board ist auf der Seite \"Alle Boards\" zusehen.", + "import-json-placeholder": "Fügen Sie die korrekten JSON-Daten hier ein", + "import-csv-placeholder": "Fügen Sie die korrekten CSV/TSV-Daten hier ein", + "import-map-members": "Mitglieder zuordnen", + "import-members-map": "Das importierte Board hat einige Mitglieder. Bitte ordnen sie die Mitglieder, die Sie importieren wollen, Ihren Benutzern zu.", + "import-members-map-note": "Anmerkung: Nicht zugeordnete Mitglieder werden dem aktuellen Benutzer zugeordnet.", + "import-show-user-mapping": "Mitgliederzuordnung überprüfen", + "import-user-select": "Wählen Sie den bestehenden Benutzer aus, den Sie für dieses Mitglied verwenden wollen.", + "importMapMembersAddPopup-title": "Mitglied auswählen", + "info": "Version", + "initials": "Initialen", + "invalid-date": "Ungültiges Datum", + "invalid-time": "Ungültige Zeitangabe", + "invalid-user": "Ungültiger Benutzer", + "joined": "beigetreten", + "just-invited": "Sie wurden soeben zu diesem Board eingeladen", + "keyboard-shortcuts": "Tastaturkürzel", + "label-create": "Label erstellen", + "label-default": "%s Label (Standard)", + "label-delete-pop": "Aktion kann nicht rückgängig gemacht werden. Das Label wird von allen Karten entfernt und seine Historie gelöscht.", + "labels": "Labels", + "language": "Sprache", + "last-admin-desc": "Sie können keine Rollen ändern, weil es mindestens einen Administrator geben muss.", + "leave-board": "Board verlassen", + "leave-board-pop": "Sind Sie sicher, dass Sie __boardTitle__ verlassen möchten? Sie werden von allen Karten in diesem Board entfernt.", + "leaveBoardPopup-title": "Board verlassen?", + "link-card": "Link zu dieser Karte", + "list-archive-cards": "Alle Karten dieser Liste ins Archiv verschieben", + "list-archive-cards-pop": "Alle Karten dieser Liste werden vom Board entfernt. Um Karten im Papierkorb anzuzeigen und wiederherzustellen, klicken Sie auf \"Menü\" > \"Archiv\".", + "list-move-cards": "Alle Karten in dieser Liste verschieben", + "list-select-cards": "Alle Karten in dieser Liste auswählen", + "set-color-list": "Lege Farbe fest", + "listActionPopup-title": "Listenaktionen", + "settingsUserPopup-title": "Benutzereinstellungen", + "settingsTeamPopup-title": "Team-Einstellungen", + "settingsOrgPopup-title": "Organisations-Einstellungen", + "swimlaneActionPopup-title": "Swimlaneaktionen", + "swimlaneAddPopup-title": "Swimlane unterhalb einfügen", + "listImportCardPopup-title": "Eine Trello-Karte importieren", + "listImportCardsTsvPopup-title": "CSV/TSV importieren", + "listMorePopup-title": "Mehr", + "link-list": "Link zu dieser Liste", + "list-delete-pop": "Alle Aktionen werden aus dem Verlauf gelöscht und die Liste kann nicht wiederhergestellt werden.", + "list-delete-suggest-archive": "Listen können ins Archiv verschoben werden, um sie aus dem Board zu entfernen und die Aktivitäten zu behalten.", + "lists": "Listen", + "swimlanes": "Swimlanes", + "log-out": "Ausloggen", + "log-in": "Einloggen", + "loginPopup-title": "Einloggen", + "memberMenuPopup-title": "Nutzereinstellungen", + "members": "Mitglieder", + "menu": "Menü", + "move-selection": "Auswahl verschieben", + "moveCardPopup-title": "Karte verschieben", + "moveCardToBottom-title": "Ans Ende verschieben", + "moveCardToTop-title": "Zum Anfang verschieben", + "moveSelectionPopup-title": "Auswahl verschieben", + "multi-selection": "Mehrfachauswahl", + "multi-selection-label": "Label für die Auswahl setzen", + "multi-selection-member": "Mitglied für die Auswahl setzen", + "multi-selection-on": "Mehrfachauswahl ist aktiv", + "muted": "Stumm", + "muted-info": "Sie werden nicht über Änderungen auf diesem Board benachrichtigt", + "my-boards": "Meine Boards", + "name": "Name", + "no-archived-cards": "Keine Karten im Archiv.", + "no-archived-lists": "Keine Listen im Archiv.", + "no-archived-swimlanes": "Keine Swimlanes im Archiv.", + "no-results": "Keine Ergebnisse", + "normal": "Normal", + "normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.", + "not-accepted-yet": "Die Einladung wurde noch nicht angenommen", + "notify-participate": "Benachrichtigungen zu allen Karten erhalten, an denen Sie teilnehmen", + "notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten", + "optional": "optional", + "or": "oder", + "page-maybe-private": "Diese Seite könnte privat sein. Vielleicht können Sie sie sehen, wenn Sie sich einloggen.", + "page-not-found": "Seite nicht gefunden.", + "password": "Passwort", + "paste-or-dragdrop": "Einfügen oder Datei mit Drag & Drop ablegen (nur Bilder)", + "participating": "Teilnehmen", + "preview": "Vorschau", + "previewAttachedImagePopup-title": "Vorschau", + "previewClipboardImagePopup-title": "Vorschau", + "private": "Privat", + "private-desc": "Dieses Board ist privat. Nur Nutzer, die zu dem Board gehören, können es anschauen und bearbeiten.", + "profile": "Profil", + "public": "Öffentlich", + "public-desc": "Dieses Board ist öffentlich. Es ist für jeden, der den Link kennt, sichtbar und taucht in Suchmaschinen wie Google auf. Nur Nutzer, die zum Board hinzugefügt wurden, können es bearbeiten.", + "quick-access-description": "Markieren Sie ein Board mit einem Stern, um dieser Leiste eine Verknüpfung hinzuzufügen.", + "remove-cover": "Cover entfernen", + "remove-from-board": "Von Board entfernen", + "remove-label": "Label entfernen", + "listDeletePopup-title": "Liste löschen?", + "remove-member": "Nutzer entfernen", + "remove-member-from-card": "Von Karte entfernen", + "remove-member-pop": "__name__ (__username__) von __boardTitle__ entfernen? Das Mitglied wird von allen Karten auf diesem Board entfernt. Es erhält eine Benachrichtigung.", + "removeMemberPopup-title": "Mitglied entfernen?", + "rename": "Umbenennen", + "rename-board": "Board umbenennen", + "restore": "Wiederherstellen", + "save": "Speichern", + "search": "Suchen", + "rules": "Regeln", + "search-cards": "Suche nach Karten-/Listentiteln, Beschreibungen und personalisierten Feldern auf diesem Brett", + "search-example": "Suchtext eingeben und Enter drücken", + "select-color": "Farbe auswählen", + "select-board": "Board auswählen", + "set-wip-limit-value": "Setzen Sie ein Limit für die maximale Anzahl von Aufgaben in dieser Liste", + "setWipLimitPopup-title": "WIP-Limit setzen", + "shortcut-assign-self": "Fügen Sie sich zur aktuellen Karte hinzu", + "shortcut-autocomplete-emoji": "Emojis vervollständigen", + "shortcut-autocomplete-members": "Mitglieder vervollständigen", + "shortcut-clear-filters": "Alle Filter entfernen", + "shortcut-close-dialog": "Dialog schließen", + "shortcut-filter-my-cards": "Meine Karten filtern", + "shortcut-show-shortcuts": "Liste der Tastaturkürzel anzeigen", + "shortcut-toggle-filterbar": "Filter-Seitenleiste ein-/ausblenden", + "shortcut-toggle-searchbar": "Such-Seitenleiste ein-/ausblenden", + "shortcut-toggle-sidebar": "Seitenleiste ein-/ausblenden", + "show-cards-minimum-count": "Zeigt die Kartenanzahl an, wenn die Liste mehr enthält als", + "sidebar-open": "Seitenleiste öffnen", + "sidebar-close": "Seitenleiste schließen", + "signupPopup-title": "Benutzerkonto erstellen", + "star-board-title": "Klicken Sie, um das Board mit einem Stern zu markieren. Es erscheint dann oben in ihrer Boardliste.", + "starred-boards": "Markierte Boards", + "starred-boards-description": "Markierte Boards erscheinen oben in ihrer Boardliste.", + "subscribe": "Abonnieren", + "team": "Team", + "this-board": "diesem Board", + "this-card": "diese Karte", + "spent-time-hours": "Aufgewendete Zeit (Stunden)", + "overtime-hours": "Mehrarbeit (Stunden)", + "overtime": "Mehrarbeit", + "has-overtime-cards": "Hat Karten mit Mehrarbeit", + "has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten", + "time": "Zeit", + "title": "Titel", + "tracking": "Folgen", + "tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.", + "type": "Typ", + "unassign-member": "Mitglied entfernen", + "unsaved-description": "Sie haben eine nicht gespeicherte Änderung.", + "unwatch": "Beobachtung entfernen", + "upload": "Upload", + "upload-avatar": "Profilbild hochladen", + "uploaded-avatar": "Profilbild hochgeladen", + "custom-top-left-corner-logo-image-url": "Benutzerdefiniertes Logo oben links Bild URL", + "custom-top-left-corner-logo-link-url": "Benutzerdefiniertes Logo oben links Link URL", + "custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27", + "custom-login-logo-image-url": "Benutzerdefiniertes Login Logo Bild URL", + "custom-login-logo-link-url": "Benutzerdefiniertes Login Logo Link URL", + "text-below-custom-login-logo": "Text unterhalb benutzerdefiniertem Login Logo", + "automatic-linked-url-schemes": "Spezielle URL-Schemas, die durch Klick automatisch öffenbar sein sollen. Ein URL-Schema pro Zeile", + "username": "Benutzername", + "import-usernames": "Nutzernamen importieren", + "view-it": "Ansehen", + "warn-list-archived": "Warnung: Diese Karte befindet sich in einer Liste im Archiv", + "watch": "Beobachten", + "watching": "Beobachten", + "watching-info": "Sie werden über alle Änderungen in diesem Board benachrichtigt", + "welcome-board": "Willkommen-Board", + "welcome-swimlane": "Meilenstein 1", + "welcome-list1": "Grundlagen", + "welcome-list2": "Fortgeschritten", + "card-templates-swimlane": "Kartenvorlagen", + "list-templates-swimlane": "Listenvorlagen", + "board-templates-swimlane": "Boardvorlagen", + "what-to-do": "Was wollen Sie tun?", + "wipLimitErrorPopup-title": "Ungültiges WIP-Limit", + "wipLimitErrorPopup-dialog-pt1": "Die Anzahl von Aufgaben in dieser Liste ist größer als das von Ihnen definierte WIP-Limit.", + "wipLimitErrorPopup-dialog-pt2": "Bitte verschieben Sie einige Aufgaben aus dieser Liste oder setzen Sie ein grösseres WIP-Limit.", + "admin-panel": "Administration", + "settings": "Einstellungen", + "people": "Nutzer", + "registration": "Registrierung", + "disable-self-registration": "Selbstregistrierung deaktivieren", + "invite": "Einladen", + "invite-people": "Nutzer einladen", + "to-boards": "In Board(s)", + "email-addresses": "E-Mail Adressen", + "smtp-host-description": "Die Adresse Ihres SMTP-Servers für ausgehende E-Mails.", + "smtp-port-description": "Der Port Ihres SMTP-Servers für ausgehende E-Mails.", + "smtp-tls-description": "Aktiviere TLS Unterstützung für SMTP Server", + "smtp-host": "SMTP-Server", + "smtp-port": "SMTP-Port", + "smtp-username": "Benutzername", + "smtp-password": "Passwort", + "smtp-tls": "TLS Unterstützung", + "send-from": "Absender", + "send-smtp-test": "Test-E-Mail an sich selbst schicken", + "invitation-code": "Einladungscode", + "email-invite-register-subject": "__inviter__ hat Ihnen eine Einladung geschickt", + "email-invite-register-text": "Sehr geehrte(r) __user__,\n\n__inviter__ hat Sie zur Mitarbeit an einem Kanbanboard eingeladen.\n\nBitte klicken Sie auf folgenden Link:\n__url__\n\nIhr Einladungscode lautet: __icode__\n\nDanke.", + "email-smtp-test-subject": "SMTP Test-E-Mail", + "email-smtp-test-text": "Sie haben erfolgreich eine E-Mail versandt", + "error-invitation-code-not-exist": "Ungültiger Einladungscode", + "error-notAuthorized": "Sie sind nicht berechtigt diese Seite zu sehen.", + "webhook-title": "Webhook Name", + "webhook-token": "Token (Optional für Authentifizierung)", + "outgoing-webhooks": "Ausgehende Webhooks", + "bidirectional-webhooks": "Zwei-Wege Webhooks", + "outgoingWebhooksPopup-title": "Ausgehende Webhooks", + "boardCardTitlePopup-title": "Kartentitelfilter", + "disable-webhook": "Diesen Webhook deaktivieren", + "global-webhook": "Globale Webhooks", + "new-outgoing-webhook": "Neuer ausgehender Webhook", + "no-name": "(Unbekannt)", + "Node_version": "Node-Version", + "Meteor_version": "Meteor-Version", + "MongoDB_version": "MongoDB-Version", + "MongoDB_storage_engine": "MongoDB-Speicher-Engine", + "MongoDB_Oplog_enabled": "MongoDB-Oplog aktiviert", + "OS_Arch": "Betriebssystem-Architektur", + "OS_Cpus": "Anzahl Prozessoren", + "OS_Freemem": "Freier Arbeitsspeicher", + "OS_Loadavg": "Mittlere Systembelastung", + "OS_Platform": "Plattform", + "OS_Release": "Version des Betriebssystem", + "OS_Totalmem": "Gesamter Arbeitsspeicher", + "OS_Type": "Typ des Betriebssystems", + "OS_Uptime": "Laufzeit des Systems", + "days": "Tage", + "hours": "Stunden", + "minutes": "Minuten", + "seconds": "Sekunden", + "show-field-on-card": "Zeige dieses Feld auf der Karte", + "automatically-field-on-card": "Füge Feld neuen Karten hinzu", + "always-field-on-card": "Füge Feld allen Karten hinzu", + "showLabel-field-on-card": "Feldbezeichnung auf Minikarte anzeigen", + "showSum-field-on-list": "Zeige Summe der Felder oben in der Liste", + "yes": "Ja", + "no": "Nein", + "accounts": "Konten", + "accounts-allowEmailChange": "Ändern der E-Mailadresse erlauben", + "accounts-allowUserNameChange": "Ändern des Benutzernamens erlauben", + "tableVisibilityMode-allowPrivateOnly": "Board-Sichtbarkeit: Erlaube ausschließlich private Boards", + "tableVisibilityMode": "Sichtbarkeit der Boards", + "createdAt": "Erstellt am", + "modifiedAt": "Geändert am", + "verified": "Geprüft", + "active": "Aktiv", + "card-received": "Empfangen", + "card-received-on": "Empfangen am", + "card-end": "Ende", + "card-end-on": "Endet am", + "editCardReceivedDatePopup-title": "Empfangsdatum ändern", + "editCardEndDatePopup-title": "Enddatum ändern", + "setCardColorPopup-title": "Farbe festlegen", + "setCardActionsColorPopup-title": "Farbe wählen", + "setSwimlaneColorPopup-title": "Farbe wählen", + "setListColorPopup-title": "Farbe wählen", + "assigned-by": "Zugewiesen von", + "requested-by": "Angefordert von", + "card-sorting-by-number": "Kartensortierung nach Nummer", + "board-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Sie werden alle Listen, Karten und Aktionen, die mit diesem Board verbunden sind, verlieren.", + "delete-board-confirm-popup": "Alle Listen, Karten, Labels und Akivitäten werden gelöscht und Sie können die Inhalte des Boards nicht wiederherstellen! Die Aktion kann nicht rückgängig gemacht werden.", + "boardDeletePopup-title": "Board löschen?", + "delete-board": "Board löschen", + "default-subtasks-board": "Teilaufgabe für __board__ Board", + "default": "Standard", + "queue": "Warteschlange", + "subtask-settings": "Einstellungen für Teilaufgaben", + "card-settings": "Karten-Einstellungen", + "boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben", + "boardCardSettingsPopup-title": "Karten-Einstellungen", + "deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:", + "deposit-subtasks-list": "Zielliste für hier abgelegte Teilaufgaben:", + "show-parent-in-minicard": "Übergeordnetes Element auf Minikarte anzeigen:", + "prefix-with-full-path": "Vollständiger Pfad über Titel", + "prefix-with-parent": "Über Titel", + "subtext-with-full-path": "Vollständiger Pfad unter Titel", + "subtext-with-parent": "Unter Titel", + "change-card-parent": "Übergeordnete Karte ändern", + "parent-card": "Übergeordnete Karte", + "source-board": "Quellboard", + "no-parent": "Nicht anzeigen", + "activity-added-label": "fügte Label '%s' zu %s hinzu", + "activity-removed-label": "entfernte Label '%s' von %s", + "activity-delete-attach": "löschte ein Anhang von %s", + "activity-added-label-card": "Label hinzugefügt '%s'", + "activity-removed-label-card": "Label entfernt '%s'", + "activity-delete-attach-card": "hat einen Anhang gelöscht", + "activity-set-customfield": "setze benutzerdefiniertes Feld '%s' zu '%s' in %s", + "activity-unset-customfield": "entferne benutzerdefiniertes Feld '%s' in %s", + "r-rule": "Regel", + "r-add-trigger": "Auslöser hinzufügen", + "r-add-action": "Aktion hinzufügen", + "r-board-rules": "Boardregeln", + "r-add-rule": "Regel hinzufügen", + "r-view-rule": "Regel anzeigen", + "r-delete-rule": "Regel löschen", + "r-new-rule-name": "Neuer Regeltitel", + "r-no-rules": "Keine Regeln", + "r-trigger": "Auslöser", + "r-action": "Aktion", + "r-when-a-card": "Wenn Karte", + "r-is": "wird", + "r-is-moved": "verschoben wird", + "r-added-to": "Hinzugefügt zu", + "r-removed-from": "entfernt von", + "r-the-board": "das Board", + "r-list": "Liste", + "list": "Liste", + "set-filter": "Setze Filter", + "r-moved-to": "verschoben nach", + "r-moved-from": "verschoben von", + "r-archived": "ins Archiv verschoben", + "r-unarchived": "aus dem Archiv wiederhergestellt", + "r-a-card": "einer Karte", + "r-when-a-label-is": "Wenn ein Label", + "r-when-the-label": "Wenn das Label", + "r-list-name": "Listenname", + "r-when-a-member": "Wenn ein Mitglied", + "r-when-the-member": "Wenn das Mitglied", + "r-name": "Name", + "r-when-a-attach": "Wenn ein Anhang", + "r-when-a-checklist": "Wenn eine Checkliste wird", + "r-when-the-checklist": "Wenn die Checkliste", + "r-completed": "abgeschlossen", + "r-made-incomplete": "unvollständig gemacht", + "r-when-a-item": "Wenn eine Checklistenposition", + "r-when-the-item": "Wenn die Checklistenposition", + "r-checked": "markiert wird", + "r-unchecked": "abgewählt wird", + "r-move-card-to": "Verschiebe Karte an", + "r-top-of": "Anfang von", + "r-bottom-of": "Ende von", + "r-its-list": "seiner Liste", + "r-archive": "Ins Archiv verschieben", + "r-unarchive": "Aus dem Archiv wiederherstellen", + "r-card": "Karte", + "r-add": "Hinzufügen", + "r-remove": "entfernen", + "r-label": "Label", + "r-member": "Mitglied", + "r-remove-all": "Entferne alle Mitglieder von der Karte", + "r-set-color": "Farbe festlegen auf", + "r-checklist": "Checkliste", + "r-check-all": "Alle markieren", + "r-uncheck-all": "Alle abwählen", + "r-items-check": "Elemente der Checkliste", + "r-check": "Markieren", + "r-uncheck": "Abwählen", + "r-item": "Element", + "r-of-checklist": "der Checkliste", + "r-send-email": "Eine E-Mail senden", + "r-to": "an", + "r-of": "von", + "r-subject": "Betreff", + "r-rule-details": "Regeldetails", + "r-d-move-to-top-gen": "Karte nach oben in die Liste verschieben", + "r-d-move-to-top-spec": "Karte an den Anfang der Liste verschieben", + "r-d-move-to-bottom-gen": "Karte nach unten in die Liste verschieben", + "r-d-move-to-bottom-spec": "Karte an das Ende der Liste verschieben", + "r-d-send-email": "E-Mail senden", + "r-d-send-email-to": "an", + "r-d-send-email-subject": "Betreff", + "r-d-send-email-message": "Nachricht", + "r-d-archive": "Karte ins Archiv verschieben", + "r-d-unarchive": "Karte aus dem Archiv wiederherstellen", + "r-d-add-label": "Label hinzufügen", + "r-d-remove-label": "Label entfernen", + "r-create-card": "Neue Karte erstellen", + "r-in-list": "in der Liste", + "r-in-swimlane": "in Swimlane", + "r-d-add-member": "Mitglied hinzufügen", + "r-d-remove-member": "Mitglied entfernen", + "r-d-remove-all-member": "Entferne alle Mitglieder", + "r-d-check-all": "Alle Elemente der Liste markieren", + "r-d-uncheck-all": "Alle Element der Liste abwählen", + "r-d-check-one": "Element auswählen", + "r-d-uncheck-one": "Element abwählen", + "r-d-check-of-list": "der Checkliste", + "r-d-add-checklist": "Checkliste hinzufügen", + "r-d-remove-checklist": "Checkliste entfernen", + "r-by": "durch", + "r-add-checklist": "Checkliste hinzufügen", + "r-with-items": "mit Elementen", + "r-items-list": "Element1,Element2,Element3", + "r-add-swimlane": "Füge Swimlane hinzu", + "r-swimlane-name": "Swimlanename", + "r-board-note": "Hinweis: Lassen Sie ein Feld leer, um alle möglichen Werte zu finden.", + "r-checklist-note": "Hinweis: Die Elemente der Checkliste müssen als kommagetrennte Werte geschrieben werden.", + "r-when-a-card-is-moved": "Wenn eine Karte in eine andere Liste verschoben wird", + "r-set": "Setze", + "r-update": "Aktualisiere", + "r-datefield": "Datumsfeld", + "r-df-start-at": "Start", + "r-df-due-at": "Fällig", + "r-df-end-at": "Ende", + "r-df-received-at": "Empfangen", + "r-to-current-datetime": "auf das aktuelle Datum/Zeit", + "r-remove-value-from": "Entferne Wert von", + "ldap": "LDAP", + "oauth2": "OAuth2", + "cas": "CAS", + "authentication-method": "Authentifizierungsmethode", + "authentication-type": "Authentifizierungstyp", + "custom-product-name": "Benutzerdefinierter Produktname", + "layout": "Layout", + "hide-logo": "Verstecke Logo", + "add-custom-html-after-body-start": "Füge benutzerdefiniertes HTML nach Anfang hinzu", + "add-custom-html-before-body-end": "Füge benutzerdefiniertes HTML vor Ende hinzu", + "error-undefined": "Etwas ist schief gelaufen", + "error-ldap-login": "Es ist ein Fehler beim Anmelden aufgetreten", + "display-authentication-method": "Anzeige Authentifizierungsverfahren", + "oidc-button-text": "Benutzerdefinierter Text der OIDC-Schaltfläche", + "default-authentication-method": "Standardauthentifizierungsverfahren", + "duplicate-board": "Board duplizieren", + "org-number": "Die Anzahl an Organisationen ist:", + "team-number": "Die Anzahl an Teams ist:", + "people-number": "Anzahl der Personen:", + "swimlaneDeletePopup-title": "Swimlane löschen?", + "swimlane-delete-pop": "Alle Aktionen werden aus dem Aktivitätenfeed entfernt und die Swimlane kann nicht wiederhergestellt werden. Die Aktion kann nicht rückgängig gemacht werden.", + "restore-all": "Alles wiederherstellen", + "delete-all": "Alles löschen", + "loading": "Laden, bitte warten.", + "previous_as": "letzter Zeitpunkt war", + "act-a-dueAt": "hat Fälligkeit geändert auf\nWann: __timeValue__\nWo: __card__\nvorheriger Fälligkeitszeitpunkt war __timeOldValue__", + "act-a-endAt": "hat Ende auf __timeValue__ von (__timeOldValue__) geändert", + "act-a-startAt": "hat Start auf __timeValue__ von (__timeOldValue__) geändert", + "act-a-receivedAt": "hat Empfangszeit auf __timeValue__ von (__timeOldValue__) geändert", + "a-dueAt": "hat Fälligkeit geändert auf", + "a-endAt": "hat Ende geändert auf", + "a-startAt": "hat Startzeit geändert auf", + "a-receivedAt": "hat Empfangszeit geändert auf", + "almostdue": "aktuelles Fälligkeitsdatum %s bevorstehend", + "pastdue": "aktuelles Fälligkeitsdatum %s überschritten", + "duenow": "aktuelles Fälligkeitsdatum %s heute", + "act-newDue": "__list__/__card__ hat seine 1. fällige Erinnerung [__board__]", + "act-withDue": "Erinnerung an Fällikgeit von __card__ [__board__]", + "act-almostdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist bevorstehend", + "act-pastdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist vorbei", + "act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt", + "act-atUserComment": "Sie wurden in [__board__] __list__/__card__ erwähnt", + "delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.", + "delete-team-confirm-popup": "Sind Sie sicher, daß Sie dieses Team löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.", + "delete-org-confirm-popup": "Sind Sie sicher, daß Sie diese Organisation löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.", + "accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen", + "hide-minicard-label-text": "Labeltext auf Minikarte ausblenden", + "show-desktop-drag-handles": "Desktop-Ziehpunkte anzeigen", + "assignee": "Zugewiesen", + "cardAssigneesPopup-title": "Zugewiesen", + "addmore-detail": "Eine detailliertere Beschreibung hinzufügen", + "show-on-card": "Zeige auf Karte", + "new": "Neu", + "editOrgPopup-title": "Organisation bearbeiten", + "newOrgPopup-title": "Neue Organisation", + "editTeamPopup-title": "Team bearbeiten", + "newTeamPopup-title": "Neues Team", + "editUserPopup-title": "Benutzer ändern", + "newUserPopup-title": "Neuer Benutzer", + "notifications": "Benachrichtigungen", + "view-all": "Alle anzeigen", + "filter-by-unread": "Nur ungelesene", + "mark-all-as-read": "Alle als gelesen markieren", + "remove-all-read": "Alle gelesenen entfernen", + "allow-rename": "Umbenennen erlauben", + "allowRenamePopup-title": "Umbenennen erlauben", + "start-day-of-week": "Wochentagbeginn festlegen", + "monday": "Montag", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "sunday": "Sonntag", + "status": "Status", + "swimlane": "Swimlane", + "owner": "Eigentümer", + "last-modified-at": "Zuletzt geändert um", + "last-activity": "Letzte Aktivität", + "voting": "Abstimunng", + "archived": "Archiviert", + "delete-linked-card-before-this-card": "Sie können diese Karte nicht löschen, bevor verbundene Karten nicht gelöscht wurden.", + "delete-linked-cards-before-this-list": "Sie können diese Liste erst löschen, wenn Sie alle Karten gelöscht haben, die auf Karten in dieser Liste verweisen.", + "hide-checked-items": "Erledigte ausblenden", + "task": "Aufgabe", + "create-task": "Aufgabe erstellen", + "ok": "OK", + "organizations": "Organisationen", + "teams": "Teams", + "displayName": "Anzeigename", + "shortName": "Kurzname", + "website": "Webseite", + "person": "Person", + "my-cards": "Meine Karten", + "card": "Karte", + "board": "Board", + "context-separator": "/", + "myCardsSortChange-title": "Meine Karten Sortierung", + "myCardsSortChangePopup-title": "Meine Karten Sortierung", + "myCardsSortChange-choice-board": "nach Board", + "myCardsSortChange-choice-dueat": "nach Fälligkeitsdatum", + "dueCards-title": "Fällige Karten", + "dueCardsViewChange-title": "Fällige Karten Ansicht", + "dueCardsViewChangePopup-title": "Fällige Karten Ansicht", + "dueCardsViewChange-choice-me": "Ich", + "dueCardsViewChange-choice-all": "alle Benutzer", + "dueCardsViewChange-choice-all-description": "Zeigt alle unvollständigen Karten mit einem *Fälligkeits*-Datum auf Boards, für die der Benutzer Berechtigungen hat.", + "broken-cards": "Fehlerhafte Karten", + "board-title-not-found": "Board „%s“ nicht gefunden.", + "swimlane-title-not-found": "Swimlane „%s“ nicht gefunden.", + "list-title-not-found": "Liste „%s“ nicht gefunden.", + "label-not-found": "Label „%s“ nicht gefunden.", + "label-color-not-found": "Label-Farbe „%s“ nicht gefunden.", + "user-username-not-found": "Nutzername „%s“ nicht gefunden.", + "comment-not-found": "Keine Karte gefunden, die „%s“ in einem Kommentar enthält.", + "globalSearch-title": "Alle Boards durchsuchen", + "no-cards-found": "Keine Karten gefunden", + "one-card-found": "Eine Karte gefunden", + "n-cards-found": "%s Karten gefunden", + "n-n-of-n-cards-found": "__start__–__end__ von __total__ Karten gefunden", + "operator-board": "Board", + "operator-board-abbrev": "b", + "operator-swimlane": "Swimlane", + "operator-swimlane-abbrev": "s", + "operator-list": "Liste", + "operator-list-abbrev": "l", + "operator-label": "Label", + "operator-label-abbrev": "#", + "operator-user": "Nutzer", + "operator-user-abbrev": "@", + "operator-member": "Mitglied", + "operator-member-abbrev": "m", + "operator-assignee": "Zugewiesener", + "operator-assignee-abbrev": "a", + "operator-creator": "Ersteller", + "operator-status": "Status", + "operator-due": "Fällig", + "operator-created": "erstellt", + "operator-modified": "geändert", + "operator-sort": "sortieren", + "operator-comment": "Kommentar", + "operator-has": "hat", + "operator-limit": "Begrenzung", + "predicate-archived": "archiviert", + "predicate-open": "offen", + "predicate-ended": "beendet", + "predicate-all": "alle", + "predicate-overdue": "überfällig", + "predicate-week": "Woche", + "predicate-month": "Monat", + "predicate-quarter": "Quartal", + "predicate-year": "Jahr", + "predicate-due": "Fällig", + "predicate-modified": "geändert", + "predicate-created": "erstellt", + "predicate-attachment": "Anhang", + "predicate-description": "Beschreibung", + "predicate-checklist": "Checkliste", + "predicate-start": "Start", + "predicate-end": "Ende", + "predicate-assignee": "Zugewiesener", + "predicate-member": "Mitglied", + "predicate-public": "öffentlich", + "predicate-private": "privat", + "operator-unknown-error": "„%s“ ist kein Operator", + "operator-number-expected": "Operator „__operator__“ erwartete eine Zahl, bekam aber „__value__“", + "operator-sort-invalid": "Sortierung „%s“ ist ungültig", + "operator-status-invalid": "„%s“ ist kein gültiger Status", + "operator-has-invalid": "%s ist keine gültige Prüfung auf Existenz", + "operator-limit-invalid": "%s ist keine gültige Begrenzung. Die Begrenzung sollte eine positive Ganzzahl sein.", + "next-page": "Nächste Seite", + "previous-page": "Vorherige Seite", + "heading-notes": "Bemerkungen", + "globalSearch-instructions-heading": "Hinweise zur Suche", + "globalSearch-instructions-description": "Suchanfragen können Operatoren enthalten, um die Suche zu verfeinern. Operatoren bestehen aus ihrem Namen und ihrem Wert, getrennt durch einen Doppelpunkt. Beispielsweise würde die Operatorangabe `Liste:Blockiert` die Suche beschränken auf Karten in einer Liste namens *Blockiert*. Wenn der Wert Leerschritte oder andere Spezialzeichen enthält, muss er in Anführungszeichen gesetzt sein (z.B. `__operator_list__:\"Im Review\"`).", + "globalSearch-instructions-operators": "Mögliche Operatoren:", + "globalSearch-instructions-operator-board": "`__operator_board__:` – Karten in Boards, auf die das angegebene *<title>* passt", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` – Karten in Listen, auf die das angegebene *<title>* passt", + "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|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", + "globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` – Karten, denen *<username>* *zugewiesen* ist", + "globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` – Karten, die von *<username>* angelegt wurden", + "globalSearch-instructions-operator-due": "`__operator_due__:<n>` – Karten, die spätestens in *<n>* Tagen fällig sind. `__operator_due__:__predicate_overdue__` zeigt alle Karten, für die die Fälligkeit überschritten ist.", + "globalSearch-instructions-operator-created": "`__operator_created__:<n>` – Karten, die vor maximal *<n>* Tagen angelegt wurden", + "globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` – Karten, die vor maximal *<n>* Tagen geändert wurden", + "globalSearch-instructions-operator-status": "`__operator_status__:<status>` – wo *<status>* eines der Folgenden ist:", + "globalSearch-instructions-status-archived": "`__predicate_archived__` – archivierte Karten", + "globalSearch-instructions-status-all": "`__predicate_all__` – alle archivierten und unarchivierten Karten", + "globalSearch-instructions-status-ended": "`__predicate_ended__` – Karten mit einem Enddatum", + "globalSearch-instructions-status-public": "`__predicate_public__` – Karten aus öffentlichen Boards", + "globalSearch-instructions-status-private": "`__predicate_private__` – Karten aus privaten Boards", + "globalSearch-instructions-operator-has": "`__operator_has__:<field>` – wo *<field>* eines aus `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` oder `__predicate_member__` ist. Die Angabe eines `-` vor *<field>* sucht nach leerem Feld (z.B. findet `__operator_has__:-fällig` alle Karten ohne Fälligkeitsdatum).", + "globalSearch-instructions-operator-sort": "`__operator_sort__:<sort-name>` – wo *<sort-name>* eines aus `__predicate_due__`, `__predicate_created__` oder `__predicate_modified__` ist. Zum absteigenden Sortieren ein `-` vor den Sortierschlüssel setzen.", + "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` – wo *<n>* eine positive Ganzzahl ist, die die Anzahl Karten pro Seite darstellt.", + "globalSearch-instructions-notes-1": "Mehrere Operatoren können angegeben werden.", + "globalSearch-instructions-notes-2": "Gleichartige Operatoren werden Oder-verknüpft. Karten, für die eine Bedingung zutrifft, werden ausgegeben.\n`__operator_list__:Verfügbar __operator_list__:Blockiert` würde alle Karten ausgeben, die in irgendwelchen Listen mit den Namen *Verfügbar* oder *Blockiert* stehen.", + "globalSearch-instructions-notes-3": "Verschiedenartige Operatoren werden *UND*-verknüpft. Nur Karten, auf die alle verschiedenartigen Operatoren zutreffen, werden zurückgegeben. `__operator_list__:Verfügbar __operator_label__:Rot` gibt nur Karten aus der Liste *Verfügbar* mit *rotem* Label zurück.", + "globalSearch-instructions-notes-3-2": "Tage können als positive oder negative Ganzzahl angegeben werden, oder man nutzt `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` oder `__predicate_year__` für den jeweiligen Zeitraum.", + "globalSearch-instructions-notes-4": "Bei Suchen in Texten ist die Groß-/Kleinschreibung egal.", + "globalSearch-instructions-notes-5": "Per Vorgabe werden archivierte Karten bei der Suche nicht berücksichtigt.", + "link-to-search": "Link auf diese Suche", + "excel-font": "Arial", + "number": "Zahl", + "label-colors": "Label-Farben", + "label-names": "Label-Namen", + "archived-at": "archiviert am", + "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)", + "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", + "custom-field-stringtemplate": "String-Vorlage", + "custom-field-stringtemplate-format": "Format (verwende %{value} als Platzhalter)", + "custom-field-stringtemplate-separator": "Trenner (verwende oder   für einen Leerschritt)", + "custom-field-stringtemplate-item-placeholder": "Drücke die Eingabetaste, um weitere Einträge hinzuzufügen", + "creator": "Ersteller", + "filesReportTitle": "Dateien-Bericht", + "orphanedFilesReportTitle": "Verwaister Datei-Bericht", + "reports": "Berichte", + "rulesReportTitle": "Regeln-Bericht", + "copy-swimlane": "Kopiere Swimlane", + "copySwimlanePopup-title": "Swimlane kopieren", + "display-card-creator": "Karten-Ersteller anzeigen", + "wait-spinner": "Warte-Symbol", + "Bounce": "Puls-Warte-Symbol", + "Cube": "Würfel-Warte-Symbol", + "Cube-Grid": "Würfel-Gitter-Warte-Symbol", + "Dot": "Punkt-Warte-Symbol", + "Double-Bounce": "Doppelpuls-Warte-Symbol", + "Rotateplane": "Drehscheibe-Warte-Symbol", + "Scaleout": "Scaleout-Warte-Symbol", + "Wave": "Wellen-Warte-Symbol", + "maximize-card": "Karte maximieren", + "minimize-card": "Karte minimieren", + "delete-org-warning-message": "Diese Organisation kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört.", + "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört.", + "subject": "Betreff", + "details": "Details", + "carbon-copy": "Kopie (CC:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticketnummer", + "open": "Offen", + "pending": "Unerledigt", + "closed": "Geschlossen", + "resolved": "Gelöst", + "cancelled": "Gestrichen", + "history": "Verlauf", + "request": "Anfrage", + "requests": "Anfragen", + "help-request": "Hilfsgesuch", + "editCardSortOrderPopup-title": "Sortierung ändern", + "cardDetailsPopup-title": "Kartendetails", + "add-teams": "Teams hinzufügen", + "add-teams-label": "Zugewiesene Teams werden darunter angezeigt:", + "remove-team-from-table": "Sind Sie sicher, das Sie dieses Team vom Board entfernen möchten?", + "confirm-btn": "Bestätigen", + "remove-btn": "entfernen", + "filter-card-title-label": "Nach Titel der Karte filtern", + "invite-people-success": "Registrierungseinladung erfolgreich versandt", + "invite-people-error": "Fehler beim Versand der Registrierungseinladung", + "can-invite-if-same-mailDomainName": "Name der Email-Domain", + "to-create-teams-contact-admin": "Bitte kontaktieren Sie den Administrator um Teams anlegen zu lassen.", + "Node_heap_total_heap_size": "Knoten-Heap: totale Heap-Größe", + "Node_heap_total_heap_size_executable": "Knoten-Heap: totale Heap-Größe (Executable)", + "Node_heap_total_physical_size": "Knoten-Heap: totale physische Größe", + "Node_heap_total_available_size": "Knoten-Heap: totale verfügbare Größe", + "Node_heap_used_heap_size": "Knoten-Heap: benutzte Heap-Größe", + "Node_heap_heap_size_limit": "Knoten-Heap: Heap-Größen-Limit", + "Node_heap_malloced_memory": "Knoten-Heap: malloc-belegter Speicher", + "Node_heap_peak_malloced_memory": "Knoten-Heap: Maximum des malloc-belegten Speichers", + "Node_heap_does_zap_garbage": "Knoten-Heap: macht „Zap-Garbage“", + "Node_heap_number_of_native_contexts": "Knoten-Heap: Anzahl nativer Kontexte", + "Node_heap_number_of_detached_contexts": "Knoten-Heap: Anzahl losgelöster Kontexte", + "Node_memory_usage_rss": "Knoten-Speicherverbrauch: Resident Set-Größe", + "Node_memory_usage_heap_total": "Knoten-Speicherverbrauch: totale Größe des belegten Heaps", + "Node_memory_usage_heap_used": "Knoten-Speicherverbrauch: tatsächlicher Speicherverbrauch", + "Node_memory_usage_external": "Knoten-Speicherverbrauch: extern", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" +} \ No newline at end of file diff --git a/i18n/de-CH.i18n.json b/i18n/de-CH.i18n.json index ce795fa07..f17994e54 100644 --- a/i18n/de-CH.i18n.json +++ b/i18n/de-CH.i18n.json @@ -96,6 +96,7 @@ "add-members": "Mitglieder hinzufügen", "added": "Hinzugefügt", "addMemberPopup-title": "Mitglieder", + "memberPopup-title": "Nutzereinstellungen", "admin": "Admin", "admin-desc": "Kann Karten anzeigen und bearbeiten, Mitglieder entfernen und Boardeinstellungen ändern.", "admin-announcement": "Ankündigung", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "und __count__ andere Karten", "apply": "Übernehmen", "app-is-offline": "Laden, bitte warten. Das Aktualisieren der Seite führt zu Datenverlust. Wenn das Laden nicht funktioniert, überprüfen Sie bitte, ob der Server nicht angehalten wurde.", + "app-try-reconnect": "Versuch die Verbindung wiederherzustellen.", "archive": "Ins Archiv verschieben", "archive-all": "Alles ins Archiv verschieben", "archive-board": "Board ins Archiv verschieben", @@ -159,6 +161,8 @@ "card-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Alle Aktionen, die dieser Karte zugeordnet sind, werden ebenfalls gelöscht.", "card-delete-pop": "Alle Aktionen werden aus dem Aktivitätsfeed entfernt und die Karte kann nicht wiedereröffnet werden. Die Aktion kann nicht rückgängig gemacht werden.", "card-delete-suggest-archive": "Sie können eine Karte ins Archiv verschieben, um sie vom Board zu entfernen und die Aktivitäten zu behalten.", + "card-archive-pop": "Die Karte wird nach der Archivierung in dieser Liste nicht mehr sichtbar sein.", + "card-archive-suggest-cancel": "Die Karte kann später aus dem Archiv wiederhergestellt werden.", "card-due": "fällig", "card-due-on": "fällig am", "card-spent": "Aufgewendete Zeit", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Planning Poker löschen ?", "poker-delete-pop": "Die Löschung ist permanent. Sie werden alles im Zusammenhang mit diesem Planning Poker verlieren.", "cardDeletePopup-title": "Karte löschen?", + "cardArchivePopup-title": "Karte archivieren?", "cardDetailsActionsPopup-title": "Kartenaktionen", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Mitglieder", @@ -264,18 +269,22 @@ "color-white": "Weiss", "color-yellow": "gelb", "unset-color": "Nicht festgelegt", - "comment": "Kommentar", + "comment": "Kommentar speichern", "comment-placeholder": "Kommentar schreiben", "comment-only": "Nur Kommentare", "comment-only-desc": "Kann Karten nur kommentieren.", + "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen möchten?", + "deleteCommentPopup-title": "Kommentar löschen?", "no-comments": "Keine Kommentare", "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", "worker": "Arbeiter", "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", "computer": "Computer", "confirm-subtask-delete-dialog": "Wollen Sie die Teilaufgabe wirklich löschen?", - "confirm-checklist-delete-dialog": "Wollen Sie die Checkliste wirklich löschen?", + "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", + "checklistDeletePopup-title": "Checkliste löschen?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", + "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", "linkCardPopup-title": "Karte verknüpfen", "searchElementPopup-title": "Suche", "copyCardPopup-title": "Karte kopieren", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Startdatum ändern", "editCardDueDatePopup-title": "Fälligkeitsdatum ändern", "editCustomFieldPopup-title": "Feld bearbeiten", + "addReactionPopup-title": "Bewertung hinzufügen", "editCardSpentTimePopup-title": "Aufgewendete Zeit ändern", "editLabelPopup-title": "Label ändern", "editNotificationPopup-title": "Benachrichtigung ändern", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Board exportieren", "exportCardPopup-title": "Karte exportieren", "sort": "Sortieren", + "sorted": "Sortiert", + "remove-sort": "Sortierung entfernen", "sort-desc": "Zum Sortieren der Liste klicken", "list-sort-by": "Sortieren der Liste nach:", "list-label-modifiedAt": "Letzte Zugriffszeit", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Füge Feld neuen Karten hinzu", "always-field-on-card": "Füge Feld allen Karten hinzu", "showLabel-field-on-card": "Feldbezeichnung auf Minikarte anzeigen", + "showSum-field-on-list": "Zeige Summe der Felder oben in der Liste", "yes": "Ja", "no": "Nein", "accounts": "Konten", "accounts-allowEmailChange": "Ändern der E-Mailadresse erlauben", "accounts-allowUserNameChange": "Ändern des Benutzernamens erlauben", + "tableVisibilityMode-allowPrivateOnly": "Sichtbarkeit von Boards: Erlaube nur private Boards", + "tableVisibilityMode": "Sichtbarkeit von Boards", "createdAt": "Erstellt am", "modifiedAt": "Geändert am", "verified": "Geprüft", @@ -825,6 +840,7 @@ "error-undefined": "Etwas ist schief gelaufen", "error-ldap-login": "Es ist ein Fehler beim Anmelden aufgetreten", "display-authentication-method": "Anzeige Authentifizierungsverfahren", + "oidc-button-text": "Benutzerdefinierter Text der OIDC-Schaltfläche", "default-authentication-method": "Standardauthentifizierungsverfahren", "duplicate-board": "Board duplizieren", "org-number": "Die Anzahl an Organisationen ist:", @@ -951,7 +967,7 @@ "operator-created": "erstellt", "operator-modified": "geändert", "operator-sort": "sortieren", - "operator-comment": "Kommentar", + "operator-comment": "kommentieren", "operator-has": "hat", "operator-limit": "Begrenzung", "predicate-archived": "archiviert", @@ -1059,5 +1075,55 @@ "maximize-card": "Karte maximieren", "minimize-card": "Karte minimieren", "delete-org-warning-message": "Diese Organisation kann nicht gelöscht werden. Zumindest ein Benutzer ist ihr noch zugehörig.", - "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden. Zumindest ein Benutzer ist ihm noch zugehörig." + "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden. Zumindest ein Benutzer ist ihm noch zugehörig.", + "subject": "Betreff", + "details": "Details", + "carbon-copy": "Kopie (CC)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticketnummer", + "open": "Offen", + "pending": "Unerledigt", + "closed": "Geschlossen", + "resolved": "Gelöst", + "cancelled": "Abgebrochen", + "history": "Verlauf", + "request": "Anfrage", + "requests": "Anfragen", + "help-request": "Hilfegesuch", + "editCardSortOrderPopup-title": "Sortierung ändern", + "cardDetailsPopup-title": "Kartendetails", + "add-teams": "Teams hinzufügen", + "add-teams-label": "Hinzugefügte Teams werden nachfolgend angezeigt:", + "remove-team-from-table": "Sind Sie sicher, das Sie dieses Team vom Board entfernen möchten?", + "confirm-btn": "Bestätigen", + "remove-btn": "entfernen", + "filter-card-title-label": "nach Kartentitel filtern", + "invite-people-success": "Registrierungseinladung erfolgreich versandt", + "invite-people-error": "Fehler beim Versand der Registrierungseinladung", + "can-invite-if-same-mailDomainName": "Name der Email-Domain", + "to-create-teams-contact-admin": "Kontaktieren SIe den Administrator um ein Team erstellen zu lassen.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Organisation hinzufügen", + "add-organizations-label": "Hinzugefügte Organisationen werden nachfolgend angezeigt:", + "remove-organization-from-board": "Sind Sie sicher, das Sie diese Organisation von diesem Board entfernen möchten?", + "to-create-organizations-contact-admin": "Um Organisationen anzulegen, kontaktieren Sie sich bitte an den Administrator.", + "custom-legal-notice-link-url": "URL zu benutzerdefiniertem Impressum", + "acceptance_of_our_legalNotice": "Wenn Sie fortfahren, akzeptieren Sie unsere", + "legalNotice": "Impressum/Datenschutzerklärung", + "copied": "Kopiert!" } \ No newline at end of file diff --git a/i18n/de.i18n.json b/i18n/de.i18n.json index 099ec34fa..f220a2046 100644 --- a/i18n/de.i18n.json +++ b/i18n/de.i18n.json @@ -89,13 +89,14 @@ "add-subtask": "Teilaufgabe hinzufügen", "add-checklist": "Checkliste hinzufügen", "add-checklist-item": "Element zu Checkliste hinzufügen", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Zu Karte umwandeln", "add-cover": "Cover hinzufügen", "add-label": "Label hinzufügen", "add-list": "Liste hinzufügen", "add-members": "Mitglieder hinzufügen", "added": "Hinzugefügt", "addMemberPopup-title": "Mitglieder", + "memberPopup-title": "Nutzereinstellungen", "admin": "Admin", "admin-desc": "Kann Karten anzeigen und bearbeiten, Mitglieder entfernen und Boardeinstellungen ändern.", "admin-announcement": "Ankündigung", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "und __count__ andere Karten", "apply": "Übernehmen", "app-is-offline": "Laden, bitte warten. Das Aktualisieren der Seite führt zu Datenverlust. Wenn das Laden nicht funktioniert, überprüfen Sie bitte, ob der Server nicht angehalten wurde.", + "app-try-reconnect": "Versuche die Verbindung wiederherzustellen", "archive": "Ins Archiv verschieben", "archive-all": "Alles ins Archiv verschieben", "archive-board": "Board ins Archiv verschieben", @@ -159,6 +161,8 @@ "card-delete-notice": "Löschen kann nicht rückgängig gemacht werden. Alle Aktionen, die dieser Karte zugeordnet sind, werden ebenfalls gelöscht.", "card-delete-pop": "Alle Aktionen werden aus dem Aktivitätsfeed entfernt und die Karte kann nicht wiedereröffnet werden. Die Aktion kann nicht rückgängig gemacht werden.", "card-delete-suggest-archive": "Sie können eine Karte ins Archiv verschieben, um sie vom Board zu entfernen und die Aktivitäten zu behalten.", + "card-archive-pop": "Die Karte wird nach ihrer Archivierung nicht in dieser Liste sichtbar sein.", + "card-archive-suggest-cancel": "Sie können die Karte später aus dem Archiv wiederherstellen.", "card-due": "Fällig", "card-due-on": "Fällig am", "card-spent": "Aufgewendete Zeit", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Planungspoker löschen?", "poker-delete-pop": "Die Löschung ist permanent. Sie werden alles im Zusammenhang mit diesem Planungspoker verlieren.", "cardDeletePopup-title": "Karte löschen?", + "cardArchivePopup-title": "Karte archivieren?", "cardDetailsActionsPopup-title": "Kartenaktionen", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Mitglieder", @@ -268,14 +273,18 @@ "comment-placeholder": "Kommentar schreiben", "comment-only": "Nur Kommentare", "comment-only-desc": "Kann Karten nur kommentieren.", + "comment-delete": "Sind Sie sicher, dass Sie den Kommentar löschen wollen?", + "deleteCommentPopup-title": "Kommentar löschen?", "no-comments": "Keine Kommentare", "no-comments-desc": "Kann keine Kommentare und Aktivitäten sehen.", "worker": "Arbeiter", "worker-desc": "Kann Karten nur verschieben, sich selbst zuweisen und kommentieren.", "computer": "Computer", "confirm-subtask-delete-dialog": "Wollen Sie die Teilaufgabe wirklich löschen?", - "confirm-checklist-delete-dialog": "Wollen Sie die Checkliste wirklich löschen?", + "confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?", + "checklistDeletePopup-title": "Checkliste löschen?", "copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage", + "copy-text-to-clipboard": "Text in die Zwischenablage kopieren", "linkCardPopup-title": "Karte verknüpfen", "searchElementPopup-title": "Suche", "copyCardPopup-title": "Karte kopieren", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Startdatum ändern", "editCardDueDatePopup-title": "Fälligkeitsdatum ändern", "editCustomFieldPopup-title": "Feld bearbeiten", + "addReactionPopup-title": "Reaktion hinzufügen", "editCardSpentTimePopup-title": "Aufgewendete Zeit ändern", "editLabelPopup-title": "Label ändern", "editNotificationPopup-title": "Benachrichtigung ändern", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Board exportieren", "exportCardPopup-title": "Karte exportieren", "sort": "Sortieren", + "sorted": "Sortiert", + "remove-sort": "Sortierung entfernen", "sort-desc": "Zum Sortieren der Liste klicken", "list-sort-by": "Sortieren der Liste nach:", "list-label-modifiedAt": "Letzte Zugriffszeit", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Füge Feld neuen Karten hinzu", "always-field-on-card": "Füge Feld allen Karten hinzu", "showLabel-field-on-card": "Feldbezeichnung auf Minikarte anzeigen", + "showSum-field-on-list": "Zeige Summe der Felder oben in der Liste", "yes": "Ja", "no": "Nein", "accounts": "Konten", "accounts-allowEmailChange": "Ändern der E-Mailadresse erlauben", "accounts-allowUserNameChange": "Ändern des Benutzernamens erlauben", + "tableVisibilityMode-allowPrivateOnly": "Board-Sichtbarkeit: Erlaube ausschließlich private Boards", + "tableVisibilityMode": "Sichtbarkeit der Boards", "createdAt": "Erstellt am", "modifiedAt": "Geändert am", "verified": "Geprüft", @@ -825,6 +840,7 @@ "error-undefined": "Etwas ist schief gelaufen", "error-ldap-login": "Es ist ein Fehler beim Anmelden aufgetreten", "display-authentication-method": "Anzeige Authentifizierungsverfahren", + "oidc-button-text": "Benutzerdefinierter Text der OIDC-Schaltfläche", "default-authentication-method": "Standardauthentifizierungsverfahren", "duplicate-board": "Board duplizieren", "org-number": "Die Anzahl an Organisationen ist:", @@ -1059,5 +1075,55 @@ "maximize-card": "Karte maximieren", "minimize-card": "Karte minimieren", "delete-org-warning-message": "Diese Organisation kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört.", - "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört." + "delete-team-warning-message": "Dieses Team kann nicht gelöscht werden, da wenigstens ein Nutzer dazu gehört.", + "subject": "Betreff", + "details": "Details", + "carbon-copy": "Kopie (CC:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticketnummer", + "open": "Offen", + "pending": "Unerledigt", + "closed": "Geschlossen", + "resolved": "Gelöst", + "cancelled": "Gestrichen", + "history": "Verlauf", + "request": "Anfrage", + "requests": "Anfragen", + "help-request": "Hilfsgesuch", + "editCardSortOrderPopup-title": "Sortierung ändern", + "cardDetailsPopup-title": "Kartendetails", + "add-teams": "Teams hinzufügen", + "add-teams-label": "Zugewiesene Teams werden darunter angezeigt:", + "remove-team-from-table": "Sind Sie sicher, das Sie dieses Team vom Board entfernen möchten?", + "confirm-btn": "Bestätigen", + "remove-btn": "entfernen", + "filter-card-title-label": "Nach Titel der Karte filtern", + "invite-people-success": "Registrierungseinladung erfolgreich versandt", + "invite-people-error": "Fehler beim Versand der Registrierungseinladung", + "can-invite-if-same-mailDomainName": "Name der Email-Domain", + "to-create-teams-contact-admin": "Bitte kontaktieren Sie den Administrator um Teams anlegen zu lassen.", + "Node_heap_total_heap_size": "Knoten-Heap: totale Heap-Größe", + "Node_heap_total_heap_size_executable": "Knoten-Heap: totale Heap-Größe (Executable)", + "Node_heap_total_physical_size": "Knoten-Heap: totale physische Größe", + "Node_heap_total_available_size": "Knoten-Heap: totale verfügbare Größe", + "Node_heap_used_heap_size": "Knoten-Heap: benutzte Heap-Größe", + "Node_heap_heap_size_limit": "Knoten-Heap: Heap-Größen-Limit", + "Node_heap_malloced_memory": "Knoten-Heap: malloc-belegter Speicher", + "Node_heap_peak_malloced_memory": "Knoten-Heap: Maximum des malloc-belegten Speichers", + "Node_heap_does_zap_garbage": "Knoten-Heap: macht „Zap-Garbage“", + "Node_heap_number_of_native_contexts": "Knoten-Heap: Anzahl nativer Kontexte", + "Node_heap_number_of_detached_contexts": "Knoten-Heap: Anzahl losgelöster Kontexte", + "Node_memory_usage_rss": "Knoten-Speicherverbrauch: Resident Set-Größe", + "Node_memory_usage_heap_total": "Knoten-Speicherverbrauch: totale Größe des belegten Heaps", + "Node_memory_usage_heap_used": "Knoten-Speicherverbrauch: tatsächlicher Speicherverbrauch", + "Node_memory_usage_external": "Knoten-Speicherverbrauch: extern", + "add-organizations": "Organisation hinzufügen", + "add-organizations-label": "Hinzugefügte Organisationen werden nachfolgend angezeigt:", + "remove-organization-from-board": "Sicher, dass du die Organisation von diesem Board entfernen willst?", + "to-create-organizations-contact-admin": "Um Organisationen anzulegen, wende dich bitte an den Administrator.", + "custom-legal-notice-link-url": "URL zu eigenem Impressum", + "acceptance_of_our_legalNotice": "Durch das Einloggen akzeptieren Sie unser", + "legalNotice": "Impressum/Datenschutzerklärung", + "copied": "Kopiert!" } \ No newline at end of file diff --git a/i18n/el.i18n.json b/i18n/el-GR.i18n.json similarity index 94% rename from i18n/el.i18n.json rename to i18n/el-GR.i18n.json index 02eb3b240..051918b31 100644 --- a/i18n/el.i18n.json +++ b/i18n/el-GR.i18n.json @@ -96,6 +96,7 @@ "add-members": "Προσθήκη Μελών", "added": "Προστέθηκε", "addMemberPopup-title": "Μέλη", + "memberPopup-title": "Ρυθμίσεις Μελών", "admin": "Διαχειριστής", "admin-desc": "Μπορεί να δει, να επεξεργαστεί κάρτες, να διαγράψει μέλη και να μεταβάλει τις ρυθμίσεις του πίνακα.", "admin-announcement": "Ανακοίνωση", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Και __count__ επιπλέον κάρτες", "apply": "Εφαρμογή", "app-is-offline": "Φορτώνει, παρακαλώ περιμένετε. Η ανανέωση της σελίδας θα προκαλέσει απώλεια δεδομένων. Αν η φόρτωση δεν επιτύχει, παρακαλούμε ελέγξτε ότι ο server δεν έχει σταματήσει.", + "app-try-reconnect": "Try to reconnect.", "archive": "Μετακίνηση στο Αρχείο", "archive-all": "Μετακίνηση Όλων στο Αρχείο", "archive-board": "Μετακίνηση Πίνακα στο Αρχείο", @@ -156,9 +158,11 @@ "card-archived": "Αυτή η κάρτα μετακινήθηκε στο Αρχείο.", "board-archived": "Αυτός ο πίνακας μετακινήθηκε στο Αρχείο.", "card-comments-title": "Αυτή η κάρτα έχει %s σχόλιο.", - "card-delete-notice": "Η Διαγραφή είναι μόνιμη. Θα χάσετε όλες τις ενέργειες που σχετίζονται με αυτή την κάρτα. ", + "card-delete-notice": "Η Διαγραφή είναι μόνιμη. Θα χάσετε όλες τις ενέργειες που σχετίζονται με αυτή την κάρτα.", "card-delete-pop": "Όλες οι ενέργειες θα αφαιρεθούν από τη ροή δραστηριοτήτων και δε θα μπορείτε να ξανανοίξετε την κάρτα. Δεν υπάρχει δυνατότητα επαναφοράς.", "card-delete-suggest-archive": "Μπορείτε να μετακινήσετε μια κάρτα στο Αρχείο για να την αφαιρέσετε από τον πίνακα και να διατηρήσετε τη δραστηριότητα.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Έως", "card-due-on": "Έως τις", "card-spent": "Δαπανηθείς Χρόνος", @@ -167,7 +171,7 @@ "card-edit-labels": "Επεξεργασία ετικετών", "card-edit-members": "Επεξεργασία μελών", "card-labels-title": "Αλλαγή ετικετών για την κάρτα.", - "card-members-title": "Προσθήκη ή διαγραφή μελών του πίνακα από την κάρτα. ", + "card-members-title": "Προσθήκη ή διαγραφή μελών του πίνακα από την κάρτα.", "card-start": "Έναρξη", "card-start-on": "Αρχίζει σε", "cardAttachmentsPopup-title": "Συνημμένο Από", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Διαγραφή Κάρτας;", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Ενέργειες κάρτας", "cardLabelsPopup-title": "Ετικέτες", "cardMembersPopup-title": "Μέλοι", @@ -236,7 +241,7 @@ "clipboard": "Clipboard ή drag & drop", "close": "Κλείσιμο", "close-board": "Κλείσιμο Πίνακα", - "close-board-pop": "Μελλοντικά μπορείτε να επαναφέρετε τον πίνακα κάνοντας κλικ στο κουμπί \"Αρχειοθέτηση\" από την αρχική επικεφαλίδα. ", + "close-board-pop": "Μελλοντικά μπορείτε να επαναφέρετε τον πίνακα κάνοντας κλικ στο κουμπί \"Αρχειοθέτηση\" από την αρχική επικεφαλίδα.", "close-card": "Close Card", "color-black": "μαύρο", "color-blue": "μπλε", @@ -268,14 +273,18 @@ "comment-placeholder": "Συγγραφή Σχολίου", "comment-only": "Μόνο σχόλιο", "comment-only-desc": "Μπορεί μόνο να σχολιάζει σε κάρτες.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Χωρίς σχόλια", "no-comments-desc": "Δε μπορεί να δει σχόλια και δραστηριότητες.", "worker": "Worker", "worker-desc": "Μπορεί μόνο να μετακινεί κάρτες, να αναθέτει μια κάρτα στον εαυτό του και να σχολιάζει.", "computer": "Υπολογιστής", "confirm-subtask-delete-dialog": "Είστε σίγουροι ότι θέλετε να σβήσετε την υποεργασία;", - "confirm-checklist-delete-dialog": "Είστε σίγουρι ότι θέλετε να διαγράψετε τη λίστα ελέγχου - checklist;", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Αντιγραφή του συνδέσμου της κάρτας στο clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Σύνδεση Κάρτας", "searchElementPopup-title": "Αναζήτηση", "copyCardPopup-title": "Αντιγραφή Κάρτας", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Αλλαγή ημερομηνίας έναρξης", "editCardDueDatePopup-title": "Αλλαγή ημερομηνίας λήξης προθεσμίας", "editCustomFieldPopup-title": "Επεξεργασία Πεδίου", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Αλλαγή δαπανηθέντος χρόνου", "editLabelPopup-title": "Αλλαγή Ετικέτας", "editNotificationPopup-title": "Επεξεργασία Ειδοποίησης", @@ -345,8 +355,8 @@ "error-board-notAdmin": "Πρέπει να είστε διαχειριστής του πίνακα αυτού για να προβείτε σε αυτό", "error-board-notAMember": "Πρέπει να είστε μέλος του πίνακα αυτού για να προβείτε σε αυτό", "error-json-malformed": "Το κείμενο δεν είναι έγκυρο JSON", - "error-json-schema": "Τα JSON δεδομένα σας δεν περιλαμβάνουν την ορθή πληροφορία στην ορθή μορφοποίηση ", - "error-csv-schema": "Το CSV(Comma Separated Values)/TSV (Tab Separated Values) σας δεν περιλαμβάνει την ορθή πληροφορία σε ορθή μορφοποίηση ", + "error-json-schema": "Τα JSON δεδομένα σας δεν περιλαμβάνουν την ορθή πληροφορία στην ορθή μορφοποίηση", + "error-csv-schema": "Το CSV(Comma Separated Values)/TSV (Tab Separated Values) σας δεν περιλαμβάνει την ορθή πληροφορία σε ορθή μορφοποίηση", "error-list-doesNotExist": "Η λίστα δεν υπάρχει", "error-user-doesNotExist": "Ο χρήστης δεν υπάρχει", "error-user-notAllowSelf": "Δε μπορείτε να αυτοπροσκληθείτε", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Εξαγωγή πίνακα", "exportCardPopup-title": "Export card", "sort": "Ταξινόμηση", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Κάντε κλικ για να ταξινομήστε τη λίστα", "list-sort-by": "Ταξινόμηση λίστας βάσει:", "list-label-modifiedAt": "Τελευταία Προσπέλαση", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Ναι", "no": "Όχι", "accounts": "Λογαριασμοί", "accounts-allowEmailChange": "Επίτρεψε Αλλαγή Email", "accounts-allowUserNameChange": "Επίτρεψε Αλλαγή Ονόματος χρήστη", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Δημιουργήθηκε στις", "modifiedAt": "Modified at", "verified": "Επιβεβαιώθηκε", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/en-DE.i18n.json b/i18n/en-DE.i18n.json new file mode 100644 index 000000000..336f3ef24 --- /dev/null +++ b/i18n/en-DE.i18n.json @@ -0,0 +1,1129 @@ +{ + "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-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "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.", + "app-try-reconnect": "Try to reconnect.", + "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", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "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>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "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.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "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.", + "close-card": "Close Card", + "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.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "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-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text 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", + "addReactionPopup-title": "Add reaction", + "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", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove 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", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "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", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization 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", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "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", + "card-sorting-by-number": "Card sorting by number", + "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", + "oidc-button-text": "Customize the OIDC button text", + "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.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? 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-creator": "creator", + "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-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "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", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Betreff", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" +} \ No newline at end of file diff --git a/i18n/en-GB.i18n.json b/i18n/en-GB.i18n.json index e08df9f53..c63d81b66 100644 --- a/i18n/en-GB.i18n.json +++ b/i18n/en-GB.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/en-IT.i18n.json b/i18n/en-IT.i18n.json index 76864a1c4..6ba6343be 100644 --- a/i18n/en-IT.i18n.json +++ b/i18n/en-IT.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 5f9e6897f..849a30b91 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode" : "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is: ", @@ -1061,5 +1077,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } diff --git a/i18n/eo.i18n.json b/i18n/eo.i18n.json index 59c8fa538..d60cb27e4 100644 --- a/i18n/eo.i18n.json +++ b/i18n/eo.i18n.json @@ -96,6 +96,7 @@ "add-members": "Aldoni membrojn", "added": "Aldonita", "addMemberPopup-title": "Membroj", + "memberPopup-title": "Membraj agordoj", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "apply": "Apliki", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Etikedoj", "cardMembersPopup-title": "Membroj", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "Komputilo", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Serĉi", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Redakti komencdaton", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Ŝanĝi etikedon", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Jes", "no": "Ne", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Forigi", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es-AR.i18n.json b/i18n/es-AR.i18n.json index e9b1deaf1..57e936281 100644 --- a/i18n/es-AR.i18n.json +++ b/i18n/es-AR.i18n.json @@ -96,6 +96,7 @@ "add-members": "Agregar Miembros", "added": "Agregadas", "addMemberPopup-title": "Miembros", + "memberPopup-title": "Opciones de Miembros", "admin": "Administrador", "admin-desc": "Puede ver y editar tarjetas, eliminar miembros, y cambiar opciones para el tablero.", "admin-announcement": "Anuncio", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Y __count__ otras tarjetas", "apply": "Aplicar", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Mover al Archivo", "archive-all": "Mover Todo al Archivo", "archive-board": "Mover Tablero al Archivo", @@ -159,6 +161,8 @@ "card-delete-notice": "Borrar es permanente. Perderás todas las acciones asociadas con esta tarjeta.", "card-delete-pop": "Todas las acciones van a ser eliminadas del agregador de actividad y no podrás re-abrir la tarjeta. No hay deshacer.", "card-delete-suggest-archive": "Podés mover una tarjeta al Archivo para eliminarla del tablero y preservar la actividad.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Vence", "card-due-on": "Vence en", "card-spent": "Tiempo Empleado", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "¿Borrar Tarjeta?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Acciones de la Tarjeta", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Miembros", @@ -268,14 +273,18 @@ "comment-placeholder": "Comentar", "comment-only": "Comentar solamente", "comment-only-desc": "Puede comentar en tarjetas solamente.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Sin comentarios", "no-comments-desc": "Can not see comments and activities.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Computadora", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copiar enlace a tarjeta en el portapapeles", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Tarjeta vinculada", "searchElementPopup-title": "Buscar", "copyCardPopup-title": "Copiar Tarjeta", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambiar fecha de inicio", "editCardDueDatePopup-title": "Cambiar fecha de vencimiento", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Cambiar tiempo empleado", "editLabelPopup-title": "Cambiar Etiqueta", "editNotificationPopup-title": "Editar Notificación", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar tablero", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Si", "no": "No", "accounts": "Cuentas", "accounts-allowEmailChange": "Permitir Cambio de Email", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Creado en", "modifiedAt": "Modified at", "verified": "Verificado", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es-CL.i18n.json b/i18n/es-CL.i18n.json index ee3e4627b..abca3b2a6 100644 --- a/i18n/es-CL.i18n.json +++ b/i18n/es-CL.i18n.json @@ -96,6 +96,7 @@ "add-members": "Añadir miembros", "added": "Añadida el", "addMemberPopup-title": "Miembros", + "memberPopup-title": "Preferencias de miembro", "admin": "Administrador", "admin-desc": "Puedes ver y editar tarjetas, eliminar miembros, y cambiar las preferencias del tablero", "admin-announcement": "Aviso", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "y otras __count__ tarjetas", "apply": "Aplicar", "app-is-offline": "Cargando, espera por favor. Refrescar esta página causará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.", + "app-try-reconnect": "Try to reconnect.", "archive": "Archivar", "archive-all": "Archivar todo", "archive-board": "Archivar este tablero", @@ -159,6 +161,8 @@ "card-delete-notice": "la eliminación es permanente. Perderás todas las acciones asociadas a esta tarjeta.", "card-delete-pop": "Se eliminarán todas las acciones del historial de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.", "card-delete-suggest-archive": "Puedes mover una tarjeta al Archivo para quitarla del tablero y preservar la actividad.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Vence", "card-due-on": "Vence el", "card-spent": "Tiempo consumido", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "¿Eliminar la tarjeta?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Acciones de la tarjeta", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Miembros", @@ -268,14 +273,18 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Solo puedes comentar en las tarjetas.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", "worker": "Trabajador", "worker-desc": "Solo puede mover tarjetas, asignarse a la tarjeta y comentar.", "computer": "el ordenador", "confirm-subtask-delete-dialog": "¿Seguro que quieres eliminar la subtarea?", - "confirm-checklist-delete-dialog": "¿Seguro que quieres eliminar la lista de verificación?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Enlazar tarjeta", "searchElementPopup-title": "Buscar", "copyCardPopup-title": "Copiar la tarjeta", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambiar la fecha de comienzo", "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento", "editCustomFieldPopup-title": "Editar el campo", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Cambiar el tiempo consumido", "editLabelPopup-title": "Cambiar la etiqueta", "editNotificationPopup-title": "Editar las notificaciones", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar el tablero", "exportCardPopup-title": "Export card", "sort": "Ordenar", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click para ordenar la lista", "list-sort-by": "Ordenar la lista por:", "list-label-modifiedAt": "Hora de último acceso", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Add field to new cards", "always-field-on-card": "Add field to all cards", "showLabel-field-on-card": "Mostrar etiquetas de campos en la minitarjeta.", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Sí", "no": "No", "accounts": "Cuentas", "accounts-allowEmailChange": "Permitir cambiar el correo electrónico", "accounts-allowUserNameChange": "Permitir cambiar el nombre de usuario", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Fecha de alta", "modifiedAt": "Modified at", "verified": "Verificado", @@ -825,6 +840,7 @@ "error-undefined": "Algo no está bien", "error-ldap-login": "Ocurrió un error al intentar acceder", "display-authentication-method": "Mostrar el método de autenticación", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Método de autenticación por defecto", "duplicate-board": "Duplicar tablero", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Eliminar", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es-LA.i18n.json b/i18n/es-LA.i18n.json index 76864a1c4..6ba6343be 100644 --- a/i18n/es-LA.i18n.json +++ b/i18n/es-LA.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es-MX.i18n.json b/i18n/es-MX.i18n.json index f7c1023b9..72257c773 100644 --- a/i18n/es-MX.i18n.json +++ b/i18n/es-MX.i18n.json @@ -78,47 +78,49 @@ "activity-receivedDate": "fecha de recepción editada para %s de %s", "activity-startDate": "fecha de inicio editada a %s de %s", "activity-dueDate": "fecha de vencimiento editada a %s de %s", - "activity-endDate": "edited end date to %s of %s", - "add-attachment": "Add Attachment", - "add-board": "Add Board", - "add-template": "Add Template", - "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Add Checklist", - "add-checklist-item": "Add an item to checklist", - "convertChecklistItemToCardPopup-title": "Convert to Card", - "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", + "activity-endDate": "editada la fecha de finalización a %s de %s", + "add-attachment": "Agregar adjunto", + "add-board": "Agregar Tablero", + "add-template": "Agregar plantilla", + "add-card": "Agregar Tarjeta", + "add-card-to-top-of-list": "Agregar tarjeta al inicio de la lista", + "add-card-to-bottom-of-list": "Agregar tarjeta al final de la lista", + "add-swimlane": "Agregar un a colmuna «swimlane»", + "add-subtask": "Agregar subtarea", + "add-checklist": "Agregar lista de comprobación", + "add-checklist-item": "Agregar un elemento a la lista de comprobación", + "convertChecklistItemToCardPopup-title": "Convertir en tarjeta", + "add-cover": "Agregar portada", + "add-label": "Agregar una etiqueta", + "add-list": "Agregar Lista", + "add-members": "Agregar miembros", + "added": "Agregado", + "addMemberPopup-title": "Miembros", + "memberPopup-title": "Member Settings", + "admin": "Administrador", + "admin-desc": "Puede ver y editar tarjetas, eliminar miembros y cambiar la configuración del tablero.", + "admin-announcement": "Anuncio", + "admin-announcement-active": "Habilitar los anuncios en todo el sistema", + "admin-announcement-title": "Anuncio del administrador", + "all-boards": "Todos los tableros", + "and-n-other-card": "y __cuenta__ otra tarjeta", + "and-n-other-card_plural": "y __cuenta__ otras tarjetas", + "apply": "Aplicar", + "app-is-offline": "Cargando, por favor espera. Actualizar la página provocará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha detenido.", + "app-try-reconnect": "Try to reconnect.", + "archive": "Archivar", + "archive-all": "Archivar todo", + "archive-board": "Archivar este tablero", + "archive-card": "Archivar esta tarjeta", + "archive-list": "Archivar esta lista", + "archive-swimlane": "Archivar este carril", + "archive-selection": "Archivar selección", + "archiveBoardPopup-title": "¿Archivar este tablero?", + "archived-items": "Archivo", + "archived-boards": "Tableros en el archivo", + "restore-board": "Restaurar el tablero", "no-archived-boards": "No Boards in Archive.", - "archives": "Archive", + "archives": "Archivo", "template": "Template", "templates": "Templates", "template-container": "Template Container", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,9 +211,10 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", - "cardMembersPopup-title": "Members", + "cardMembersPopup-title": "Miembros", "cardMorePopup-title": "More", "cardTemplatePopup-title": "Create template", "cards": "Cards", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -471,7 +483,7 @@ "log-in": "Log In", "loginPopup-title": "Log In", "memberMenuPopup-title": "Member Settings", - "members": "Members", + "members": "Miembros", "menu": "Menu", "move-selection": "Move selection", "moveCardPopup-title": "Move Card", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -747,7 +762,7 @@ "r-top-of": "Top of", "r-bottom-of": "Bottom of", "r-its-list": "its list", - "r-archive": "Move to Archive", + "r-archive": "Archivar", "r-unarchive": "Restore from Archive", "r-card": "card", "r-add": "Agregar", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es-PE.i18n.json b/i18n/es-PE.i18n.json index 5247d4d3b..975174cc9 100644 --- a/i18n/es-PE.i18n.json +++ b/i18n/es-PE.i18n.json @@ -96,6 +96,7 @@ "add-members": "Agregar miembros", "added": "Agregada el", "addMemberPopup-title": "Miembros", + "memberPopup-title": "Configuración de miembros", "admin": "Administrador", "admin-desc": "Puede ver y editar tarjetas, eliminar miembros y cambiar la configuración del tablero.", "admin-announcement": "Anuncio", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "y otras __count__ tarjetas", "apply": "Aplicar", "app-is-offline": "Cargando, por favor espere. Actualizar la página causará pérdida de datos. Si la carga no funciona, por favor compruebe que el servidor no se ha detenido.", + "app-try-reconnect": "Try to reconnect.", "archive": "Archivar", "archive-all": "Archivar todo", "archive-board": "Archivar este tablero", @@ -159,6 +161,8 @@ "card-delete-notice": "la eliminación es permanente. Perderá todas las acciones asociadas a esta tarjeta.", "card-delete-pop": "Se eliminarán todas las acciones de la fuente de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.", "card-delete-suggest-archive": "Puede mover una tarjeta al archivo para quitarla del tablero y preservar la actividad.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Vence", "card-due-on": "Vence el", "card-spent": "Tiempo consumido", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "¿Eliminar la tarjeta?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Acciones de la tarjeta", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Miembros", @@ -268,14 +273,18 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Sólo puede comentar en las tarjetas.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", "worker": "Trabajador", "worker-desc": "Sólo puede mover tarjetas, asignarse a la tarjeta y comentar.", "computer": "Computadora", "confirm-subtask-delete-dialog": "¿Seguro que desea eliminar la subtarea?", - "confirm-checklist-delete-dialog": "¿Seguro que desea eliminar la lista de comprobación?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Enlazar tarjeta", "searchElementPopup-title": "Buscar", "copyCardPopup-title": "Copiar la tarjeta", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambiar la fecha de inicio", "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento", "editCustomFieldPopup-title": "Editar el campo", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Cambiar el tiempo consumido", "editLabelPopup-title": "Cambiar la etiqueta", "editNotificationPopup-title": "Editar las notificaciones", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar tablero", "exportCardPopup-title": "Export card", "sort": "Ordenar", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Clic para ordenar lista", "list-sort-by": "Ordenar la lista por:", "list-label-modifiedAt": "Hora de último acceso", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Add field to new cards", "always-field-on-card": "Add field to all cards", "showLabel-field-on-card": "Mostrar etiquetas de campos en la minitarjeta.", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Sí", "no": "No", "accounts": "Cuentas", "accounts-allowEmailChange": "Permitir cambiar el correo electrónico", "accounts-allowUserNameChange": "Permitir cambiar el nombre de usuario", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Creado en", "modifiedAt": "Modified at", "verified": "Verificado", @@ -825,6 +840,7 @@ "error-undefined": "Algo no está bien", "error-ldap-login": "Ocurrió un error al intentar acceder", "display-authentication-method": "Mostrar el método de autenticación", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Método de autenticación por defecto", "duplicate-board": "Duplicar tablero", "org-number": "El número de organizaciones es:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Eliminar", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es-PY.i18n.json b/i18n/es-PY.i18n.json index 76864a1c4..6ba6343be 100644 --- a/i18n/es-PY.i18n.json +++ b/i18n/es-PY.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/es.i18n.json b/i18n/es.i18n.json index b2a24f822..a155d4967 100644 --- a/i18n/es.i18n.json +++ b/i18n/es.i18n.json @@ -75,10 +75,10 @@ "activity-checklist-uncompleted-card": "no completó la lista de verificación %s", "activity-editComment": "comentario editado", "activity-deleteComment": "comentario eliminado", - "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", + "activity-receivedDate": "editada la fecha de recepción a %s de %s", + "activity-startDate": "editada la fecha de inicio a %s de %s", + "activity-dueDate": "editada la fecha de vencimiento a %s de %s", + "activity-endDate": "editada la fecha de finalización a %s de %s", "add-attachment": "Añadir adjunto", "add-board": "Añadir tablero", "add-template": "Añadir plantilla", @@ -89,13 +89,14 @@ "add-subtask": "Añadir subtarea", "add-checklist": "Añadir una lista de verificación", "add-checklist-item": "Añadir un elemento a la lista de verificación", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Convertir en tarjeta", "add-cover": "Añadir portada", "add-label": "Añadir una etiqueta", "add-list": "Añadir una lista", "add-members": "Añadir miembros", "added": "Añadida el", "addMemberPopup-title": "Miembros", + "memberPopup-title": "Preferencias de miembro", "admin": "Administrador", "admin-desc": "Puedes ver y editar tarjetas, eliminar miembros, y cambiar las preferencias del tablero", "admin-announcement": "Aviso", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "y otras __count__ tarjetas", "apply": "Aplicar", "app-is-offline": "Cargando, espera por favor. Refrescar esta página causará pérdida de datos. Si la carga no funciona, por favor comprueba que el servidor no se ha parado.", + "app-try-reconnect": "Try to reconnect.", "archive": "Archivar", "archive-all": "Archivar todo", "archive-board": "Archivar este tablero", @@ -159,6 +161,8 @@ "card-delete-notice": "la eliminación es permanente. Perderás todas las acciones asociadas a esta tarjeta.", "card-delete-pop": "Se eliminarán todas las acciones del historial de actividades y no se podrá volver a abrir la tarjeta. Esta acción no puede deshacerse.", "card-delete-suggest-archive": "Puedes mover una tarjeta al Archivo para quitarla del tablero y preservar la actividad.", + "card-archive-pop": "La tarjeta no será visible en la lista despues de archivarla", + "card-archive-suggest-cancel": "Podrás restaurar la tarjeta desde Archivo", "card-due": "Vence", "card-due-on": "Vence el", "card-spent": "Tiempo consumido", @@ -185,10 +189,10 @@ "vote-against": "contrarios", "deleteVotePopup-title": "¿Borrar voto?", "vote-delete-pop": "El Borrado es permanente. Perderá todas las acciones asociadas con este voto.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Comenzar una Planning Poker", + "card-edit-planning-poker": "Editar la planificación del Poker", + "editPokerEndDatePopup-title": "Cambiar la fecha final para la planificación del Poker", + "poker-question": "Planificación del Poker", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -198,15 +202,16 @@ "poker-twenty": "20", "poker-forty": "40", "poker-oneHundred": "100", - "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", + "poker-unsure": "¿?", + "poker-finish": "Finalizado", + "poker-result-votes": "Votos", + "poker-result-who": "¿Quien?", "poker-replay": "Replay", - "set-estimation": "Set Estimation", + "set-estimation": "Fijar estimación", "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "¿Eliminar la tarjeta?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Acciones de la tarjeta", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Miembros", @@ -237,7 +242,7 @@ "close": "Cerrar", "close-board": "Cerrar el tablero", "close-board-pop": "Podrás restaurar el tablero haciendo clic en el botón \"Archivo\" del encabezado de la pantalla inicial.", - "close-card": "Close Card", + "close-card": "Cerrar tarjeta", "color-black": "negra", "color-blue": "azul", "color-crimson": "carmesí", @@ -268,14 +273,18 @@ "comment-placeholder": "Escribir comentario", "comment-only": "Sólo comentarios", "comment-only-desc": "Solo puedes comentar en las tarjetas.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "No hay comentarios", "no-comments-desc": "No se pueden mostrar comentarios ni actividades.", "worker": "Trabajador", "worker-desc": "Solo puede mover tarjetas, asignarse a la tarjeta y comentar.", "computer": "el ordenador", "confirm-subtask-delete-dialog": "¿Seguro que quieres eliminar la subtarea?", - "confirm-checklist-delete-dialog": "¿Seguro que quieres eliminar la lista de verificación?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copiar el enlace de la tarjeta al portapapeles", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Enlazar tarjeta", "searchElementPopup-title": "Buscar", "copyCardPopup-title": "Copiar la tarjeta", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambiar la fecha de comienzo", "editCardDueDatePopup-title": "Cambiar la fecha de vencimiento", "editCustomFieldPopup-title": "Editar el campo", + "addReactionPopup-title": "Añadir reacción", "editCardSpentTimePopup-title": "Cambiar el tiempo consumido", "editLabelPopup-title": "Cambiar la etiqueta", "editNotificationPopup-title": "Editar las notificaciones", @@ -362,12 +372,14 @@ "export-board-excel": "Exportar tablero a Excel", "user-can-not-export-excel": "El usuario no puede exportar Excel", "export-board-html": "Exportar tablero a HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Exportar la tarjeta", + "export-card-pdf": "Exportar la tarjeta a PDF", + "user-can-not-export-card-to-pdf": "El usuario no puede exportar a PDF", "exportBoardPopup-title": "Exportar el tablero", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Exportar la tarjeta", "sort": "Ordenar", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click para ordenar la lista", "list-sort-by": "Ordenar la lista por:", "list-label-modifiedAt": "Hora de último acceso", @@ -390,7 +402,7 @@ "filter-no-label": "Sin etiqueta", "filter-member-label": "Filtrar por miembro", "filter-no-member": "Sin miembro", - "filter-assignee-label": "Filter by assignee", + "filter-assignee-label": "Filtrar por asignado", "filter-no-assignee": "No asignado", "filter-custom-fields-label": "Filtrar por campos personalizados", "filter-no-custom-fields": "Sin campos personalizados", @@ -408,7 +420,7 @@ "headerBarCreateBoardPopup-title": "Crear tablero", "home": "Inicio", "import": "Importar", - "impersonate-user": "Impersonate user", + "impersonate-user": "Impersonalizar", "link": "Enlace", "import-board": "importar un tablero", "import-board-c": "Importar un tablero", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Añadir campo a las tarjetas nuevas", "always-field-on-card": "Añadir campo a todas las tarjetas", "showLabel-field-on-card": "Mostrar etiquetas de campos en la minitarjeta.", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Sí", "no": "No", "accounts": "Cuentas", "accounts-allowEmailChange": "Permitir cambiar el correo electrónico", "accounts-allowUserNameChange": "Permitir cambiar el nombre de usuario", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Fecha de alta", "modifiedAt": "Modified at", "verified": "Verificado", @@ -825,6 +840,7 @@ "error-undefined": "Algo no está bien", "error-ldap-login": "Ocurrió un error al intentar acceder", "display-authentication-method": "Mostrar el método de autenticación", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Método de autenticación por defecto", "duplicate-board": "Duplicar tablero", "org-number": "El número de organizaciones es:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Eliminar", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/eu.i18n.json b/i18n/eu.i18n.json index c6e6a6c9a..ff5517b6b 100644 --- a/i18n/eu.i18n.json +++ b/i18n/eu.i18n.json @@ -31,9 +31,9 @@ "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-importBoard": "__board__ arbela inportatu da", + "act-importCard": "__board__ arbeleko __swimlane__  erraileko __list__  zerrendako __card__ txartela inportatu da", + "act-importList": "__board__ arbeleko __swimlane__ erraileko __list__ zerrenda inportatu da", "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__", @@ -46,56 +46,57 @@ "activities": "Jarduerak", "activity": "Jarduera", "activity-added": "%s %s(e)ra gehituta", - "activity-archived": "%s moved to Archive", + "activity-archived": "%s biltegira eraman da", "activity-attached": "%s %s(e)ra erantsita", "activity-created": "%s sortuta", - "activity-customfield-created": "created custom field %s", + "activity-customfield-created": "%s eremu pertsonalizatua sortu da", "activity-excluded": "%s %s(e)tik kanpo utzita", "activity-imported": "%s inportatuta %s(e)ra %s(e)tik", "activity-imported-board": "%s inportatuta %s(e)tik", "activity-joined": "%s(e)ra elkartuta", "activity-moved": "%s %s(e)tik %s(e)ra eramanda", - "activity-on": "%s", + "activity-on": "%s-n", "activity-removed": "%s %s(e)tik kenduta", "activity-sent": "%s %s(e)ri bidalita", "activity-unjoined": "%s utzita", - "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": "egiaztaketa zerrenda %s(e)ra gehituta", - "activity-checklist-removed": "removed a checklist from %s", + "activity-subtask-added": " %s-ra azpiataza gehitu da", + "activity-checked-item": "%s markatu da %s kontrol-zerrendan ( %s)", + "activity-unchecked-item": "%s desmarkatu da %s kontrol-zerrendan (%s)", + "activity-checklist-added": "kontrol-zerrenda %s-ra gehitu da", + "activity-checklist-removed": "kontrol zerrenda %s-tik kendu da", "activity-checklist-completed": "completed checklist %s of %s", "activity-checklist-uncompleted": "uncompleted the checklist %s of %s", "activity-checklist-item-added": "egiaztaketa zerrendako elementuak '%s'(e)ra gehituta %s(e)n", "activity-checklist-item-removed": "removed a checklist item from '%s' in %s", "add": "Gehitu", - "activity-checked-item-card": "checked %s in checklist %s", - "activity-unchecked-item-card": "unchecked %s in checklist %s", + "activity-checked-item-card": "%s markatu da %s kontrol-zerrendan", + "activity-unchecked-item-card": " %s desmarkatu da %s kontrol-zerrendan", "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-editComment": " %s iruzkina editatu da", + "activity-deleteComment": "%s iruzkina ezabatu da", "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": "Gehitu eranskina", "add-board": "Gehitu arbela", - "add-template": "Add Template", + "add-template": "Gehitu txantiloia", "add-card": "Gehitu txartela", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", - "add-swimlane": "Add Swimlane", - "add-subtask": "Add Subtask", - "add-checklist": "Gehitu egiaztaketa zerrenda", - "add-checklist-item": "Gehitu elementu bat egiaztaketa zerrendara", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-card-to-top-of-list": "Gehitu txartela zerrendaren goiko aldean", + "add-card-to-bottom-of-list": "Gehitu txartela zerrendaren beheko aldean", + "add-swimlane": "Gehitu erraila", + "add-subtask": "Gehitu azpiataza", + "add-checklist": "Gehitu kontrol-zerrenda", + "add-checklist-item": "Gehitu elementu bat kontrol-zerrendara", + "convertChecklistItemToCardPopup-title": "Txartela bihurtu", "add-cover": "Gehitu azala", "add-label": "Gehitu etiketa", "add-list": "Gehitu zerrenda", "add-members": "Gehitu kideak", "added": "Gehituta", "addMemberPopup-title": "Kideak", + "memberPopup-title": "Kidearen ezarpenak", "admin": "Kudeatzailea", "admin-desc": "Txartelak ikusi eta editatu ditzake, kideak kendu, eta arbelaren ezarpenak aldatu.", "admin-announcement": "Jakinarazpena", @@ -105,24 +106,25 @@ "and-n-other-card": "Eta beste txartel __count__", "and-n-other-card_plural": "Eta beste __count__ txartel", "apply": "Aplikatu", - "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": "Artxibatu", - "archived-boards": "Boards in Archive", + "app-is-offline": "Kargatzen, itxaron mesedez. Orria freskatzeak datuak galtzea eragingo du. Kargatzeak ez badu funtzionatzen, egiaztatu zerbitzaria ez dela gelditu.", + "app-try-reconnect": "Saiatu birkonektatzen.", + "archive": "Eraman biltegira", + "archive-all": "Eraman guztiak biltegira", + "archive-board": "Mugitu arbela biltegira", + "archive-card": "Eraman txartela biltegira", + "archive-list": "Eraman zerrenda biltegira", + "archive-swimlane": "Eraman erraila biltegira", + "archive-selection": "Eraman hautapena biltegira", + "archiveBoardPopup-title": "Mugitu arbela biltegira?", + "archived-items": "Biltegia", + "archived-boards": "Biltegiko arbelak", "restore-board": "Berreskuratu arbela", - "no-archived-boards": "No Boards in Archive.", - "archives": "Artxibatu", - "template": "Template", - "templates": "Templates", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "no-archived-boards": "Ez dago arbelik biltegian", + "archives": "Biltegia", + "template": "Txantiloia", + "templates": "Txantiloiak", + "template-container": "Txantiloien edukiontzia", + "add-template-container": "Gehitu txantiloien edukiontzia", "assign-member": "Esleitu kidea", "attached": "erantsita", "attachment": "Eranskina", @@ -130,40 +132,42 @@ "attachmentDeletePopup-title": "Ezabatu eranskina?", "attachments": "Eranskinak", "auto-watch": "Automatikoki jarraitu arbelak hauek sortzean", - "avatar-too-big": "The avatar is too large (520KB max)", + "avatar-too-big": "Avatarra handiegia da (520KB max)", "back": "Atzera", "board-change-color": "Aldatu kolorea", "board-nb-stars": "%s izar", "board-not-found": "Ez da arbela aurkitu", "board-private-info": "Arbel hau <strong>pribatua</strong> izango da.", "board-public-info": "Arbel hau <strong>publikoa</strong> izango da.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", - "boardChangeColorPopup-title": "Aldatu arbelaren atzealdea", + "board-drag-drop-reorder-or-click-open": "Arrastatu eta jaregin arbeleko ikonoak ordenatzeko. Klikatu arbeleko ikonoa arbela irekitzeko.", + "boardChangeColorPopup-title": "Aldatu arbelaren atzeko planoa", "boardChangeTitlePopup-title": "Aldatu izena arbelari", "boardChangeVisibilityPopup-title": "Aldatu ikusgaitasuna", "boardChangeWatchPopup-title": "Aldatu ikuskatzea", - "boardMenuPopup-title": "Board Settings", - "boardChangeViewPopup-title": "Board View", + "boardMenuPopup-title": "Arbelaren ezarpenak", + "boardChangeViewPopup-title": "Arbela ikuspegia", "boards": "Arbelak", - "board-view": "Board View", - "board-view-cal": "Calendar", - "board-view-swimlanes": "Swimlanes", + "board-view": "Arbela ikuspegia", + "board-view-cal": "Egutegia", + "board-view-swimlanes": "Errailak", "board-view-collapse": "Collapse", "board-view-gantt": "Gantt", "board-view-lists": "Zerrendak", "bucket-example": "Esaterako \"Pertz zerrenda\"", "cancel": "Utzi", - "card-archived": "This card is moved to Archive.", - "board-archived": "This board is moved to Archive.", + "card-archived": "Txartel hau biltegira eraman da", + "board-archived": "Arbel hau biltegira eraman da", "card-comments-title": "Txartel honek iruzkin %s dauka.", "card-delete-notice": "Ezabaketa behin betiko da. Txartel honi lotutako ekintza guztiak galduko dituzu.", "card-delete-pop": "Ekintza guztiak ekintza jariotik kenduko dira eta ezin izango duzu txartela berrireki. Ez dago desegiterik.", - "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-delete-suggest-archive": "Eraman dezakezu txartel bat biltegira arbeletik kentzeko eta aktibitatea mantendu.", + "card-archive-pop": "Txartela ez da ikusiko zerrenda honetan txartela gorde ondoren.", + "card-archive-suggest-cancel": "Geroago txartela berreskuratu dezakezu biltegitik.", "card-due": "Epemuga", "card-due-on": "Epemuga", "card-spent": "Erabilitako denbora", "card-edit-attachments": "Editatu eranskinak", - "card-edit-custom-fields": "Edit custom fields", + "card-edit-custom-fields": "Editatu eremu pertsonalizatuak", "card-edit-labels": "Editatu etiketak", "card-edit-members": "Editatu kideak", "card-labels-title": "Aldatu txartelaren etiketak", @@ -171,20 +175,20 @@ "card-start": "Hasiera", "card-start-on": "Hasiera", "cardAttachmentsPopup-title": "Erantsi hemendik", - "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", + "cardCustomField-datePopup-title": "Aldatu data", + "cardCustomFieldsPopup-title": "Editatu eremu pertsonalizatuak", + "cardStartVotingPopup-title": "Hasi bozketa", + "positiveVoteMembersPopup-title": "Aldekoak", + "negativeVoteMembersPopup-title": "Kontrakoak", + "card-edit-voting": "Editatu bozketa", + "editVoteEndDatePopup-title": "Aldatu bozketa eta data", + "allowNonBoardMembers": "Baimendu saioa hasitako erabiltzaile guztiei", + "vote-question": "Bozketaren galdera", + "vote-public": "Erakutsi zeinek zer bozkatu duen", "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.", + "deleteVotePopup-title": "Botoa ezabatu?", + "vote-delete-pop": "Ezabatzea behin betirako da. Boto honekin lotutako ekintza guztiak galduko dira.", "cardStartPlanningPokerPopup-title": "Start a Planning Poker", "card-edit-planning-poker": "Edit Planning Poker", "editPokerEndDatePopup-title": "Change Planning Poker vote end date", @@ -199,26 +203,27 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", + "poker-finish": "Bukatu da", + "poker-result-votes": "Botoak", "poker-result-who": "Who", "poker-replay": "Replay", "set-estimation": "Set Estimation", "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Ezabatu txartela?", + "cardArchivePopup-title": "Gorde txartela?", "cardDetailsActionsPopup-title": "Txartel-ekintzak", "cardLabelsPopup-title": "Etiketak", "cardMembersPopup-title": "Kideak", "cardMorePopup-title": "Gehiago", - "cardTemplatePopup-title": "Create template", + "cardTemplatePopup-title": "Sortu txantiloia", "cards": "Txartelak", "cards-count": "Txartelak", - "cards-count-one": "Card", + "cards-count-one": "Txartela", "casSignIn": "Sign In with CAS", - "cardType-card": "Card", - "cardType-linkedCard": "Linked Card", - "cardType-linkedBoard": "Linked Board", + "cardType-card": "Txartela", + "cardType-linkedCard": "Txartel estekatuta", + "cardType-linkedBoard": "Estekatutako arbela", "change": "Aldatu", "change-avatar": "Aldatu avatarra", "change-password": "Aldatu pasahitza", @@ -229,84 +234,88 @@ "changePasswordPopup-title": "Aldatu pasahitza", "changePermissionsPopup-title": "Aldatu baimenak", "changeSettingsPopup-title": "Aldatu ezarpenak", - "subtasks": "Subtasks", - "checklists": "Egiaztaketa zerrenda", + "subtasks": "Azpiatazak", + "checklists": "Kontrol-zerrendak", "click-to-star": "Egin klik arbel honi izarra jartzeko", "click-to-unstar": "Egin klik arbel honi izarra kentzeko", "clipboard": "Kopiatu eta itsatsi edo arrastatu eta jaregin", "close": "Itxi", "close-board": "Itxi arbela", - "close-board-pop": "You will be able to restore the board by clicking the “Archive” button from the home header.", - "close-card": "Close Card", + "close-board-pop": "Arbela berreskuratu dezakezu hasierako goiburuko \"Biltegia\" botoian klik eginez", + "close-card": "Txartel itxia", "color-black": "beltza", "color-blue": "urdina", - "color-crimson": "crimson", - "color-darkgreen": "darkgreen", - "color-gold": "gold", - "color-gray": "gray", + "color-crimson": "gorrimina", + "color-darkgreen": "berde iluna", + "color-gold": "urre kolorea", + "color-gray": "grisa", "color-green": "berdea", - "color-indigo": "indigo", + "color-indigo": "indigoa", "color-lime": "lima", "color-magenta": "magenta", - "color-mistyrose": "mistyrose", - "color-navy": "navy", + "color-mistyrose": "arrosa", + "color-navy": "itsas-urdina", "color-orange": "laranja", - "color-paleturquoise": "paleturquoise", - "color-peachpuff": "peachpuff", + "color-paleturquoise": "berde urdinxka", + "color-peachpuff": "mertxika", "color-pink": "larrosa", - "color-plum": "plum", + "color-plum": "arana", "color-purple": "purpura", "color-red": "gorria", - "color-saddlebrown": "saddlebrown", - "color-silver": "silver", + "color-saddlebrown": "marroi laranja", + "color-silver": "zilar kolorea", "color-sky": "zerua", - "color-slateblue": "slateblue", - "color-white": "white", + "color-slateblue": "urdin grisa", + "color-white": "zuria", "color-yellow": "horia", - "unset-color": "Unset", + "unset-color": "Zehaztu gabea", "comment": "Iruzkina", "comment-placeholder": "Idatzi iruzkin bat", "comment-only": "Iruzkinak besterik ez", - "comment-only-desc": "Iruzkinak txarteletan soilik egin ditzake", - "no-comments": "No comments", - "no-comments-desc": "Can not see comments and activities.", - "worker": "Worker", + "comment-only-desc": "Iruzkinak txarteletan soilik egin daitezke", + "comment-delete": "Ziur zaude iruzkina ezabatu nahi duzula?", + "deleteCommentPopup-title": "Ezabatu iruzkina?", + "no-comments": "Iruzkinik ez", + "no-comments-desc": "Ezin dira iruzkinak eta aktibitateak ikusi.", + "worker": "Langilea", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Ordenagailua", - "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-subtask-delete-dialog": "Ziur zaude azpiataza ezabatu nahi duzula?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopiatu txartela arbelera", - "linkCardPopup-title": "Link Card", + "copy-text-to-clipboard": "Kopiatu testua arbelean", + "linkCardPopup-title": "Estekatu txartela", "searchElementPopup-title": "Bilatu", "copyCardPopup-title": "Kopiatu txartela", - "copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards", + "copyChecklistToManyCardsPopup-title": "Kopiatu kontrol laukien txantiloia hainbat txerteletara", "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": "Sortu", "createBoardPopup-title": "Sortu arbela", "chooseBoardSourcePopup-title": "Inportatu arbela", "createLabelPopup-title": "Sortu etiketa", - "createCustomField": "Create Field", - "createCustomFieldPopup-title": "Create Field", + "createCustomField": "Sortu eremua", + "createCustomFieldPopup-title": "Sortu eremua", "current": "unekoa", - "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-delete-pop": "Ez du atzera bueltarik. Honek eremu pertsonalizatua txartel guztietatik kenduko du eta bere historia ezabatuko du.", + "custom-field-checkbox": "Kontrol-laukia", + "custom-field-currency": "Moneta", + "custom-field-currency-option": "Monetaren ikurra", "custom-field-date": "Data", - "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", + "custom-field-dropdown": "Goitik beherako zerrenda", + "custom-field-dropdown-none": "(bat ere ez)", + "custom-field-dropdown-options": "Zerrendaren aukerak", + "custom-field-dropdown-options-placeholder": "Sakatu Sartu aukera gehiago gehitzeko", + "custom-field-dropdown-unknown": "(ezezaguna)", + "custom-field-number": "Zenbakia", + "custom-field-text": "Testua", + "custom-fields": "Eremu pertsonalizatuak", "date": "Data", "decline": "Ukatu", "default-avatar": "Lehenetsitako avatarra", "delete": "Ezabatu", - "deleteCustomFieldPopup-title": "Delete Custom Field?", + "deleteCustomFieldPopup-title": "Eremu pertsonalizatua ezabatu?", "deleteLabelPopup-title": "Ezabatu etiketa?", "description": "Deskripzioa", "disambiguateMultiLabelPopup-title": "Argitu etiketaren ekintza", @@ -321,7 +330,8 @@ "soft-wip-limit": "WIP muga malgua", "editCardStartDatePopup-title": "Aldatu hasiera data", "editCardDueDatePopup-title": "Aldatu epemuga data", - "editCustomFieldPopup-title": "Edit Field", + "editCustomFieldPopup-title": "Editatu eremua", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Aldatu erabilitako denbora", "editLabelPopup-title": "Aldatu etiketa", "editNotificationPopup-title": "Editatu jakinarazpena", @@ -346,62 +356,64 @@ "error-board-notAMember": "Arbel honetako kidea izan behar zara hori egin ahal izateko", "error-json-malformed": "Zure testua ez da baliozko JSON", "error-json-schema": "Zure JSON datuek ez dute formatu zuzenaren informazio egokia", - "error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format", + "error-csv-schema": "Zure CSV(koma bidez bereizitako balioak)/TSV (tabuladorez bereizitako balioak) ez dauka baliozko informazioa baliozko formatuan. ", "error-list-doesNotExist": "Zerrenda hau ez da existitzen", "error-user-doesNotExist": "Erabiltzaile hau ez da existitzen", "error-user-notAllowSelf": "Ezin duzu zure burua gonbidatu", "error-user-notCreated": "Erabiltzaile hau sortu gabe dago", "error-username-taken": "Erabiltzaile-izen hori hartuta dago", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", + "error-orgname-taken": "Erakunde izen hori dagoeneko erabiltzen ari da", + "error-teamname-taken": "Talde izen hori dagoeneko erabiltzen ari da", "error-email-taken": "E-mail hori hartuta dago", "export-board": "Esportatu arbela", - "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", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-board-json": "Esportatu arbela JSON gisa", + "export-board-csv": "Esportatu arbela CSV gisa", + "export-board-tsv": "Esportatu arbela TSV gisa", + "export-board-excel": "Esportatu arbela Excel gisa", + "user-can-not-export-excel": "Erabiltzaileak ezin du esportatu Excel gisa", + "export-board-html": "Esportatu arbela HTLM gisa", + "export-card": "Esportatu txartela", + "export-card-pdf": "Esportatu txartela PDF gisa", + "user-can-not-export-card-to-pdf": "Erabiltzaileak ezin du txartela PDF gisa esportatu", "exportBoardPopup-title": "Esportatu arbela", - "exportCardPopup-title": "Export card", - "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", + "exportCardPopup-title": "Esportatu txartela", + "sort": "Ordenatu", + "sorted": "Ordenatu da", + "remove-sort": "Kendu ordena", + "sort-desc": "Klik egin zerrenda ordenatzeko", + "list-sort-by": "Ordenatu zerrenda honen arabera:", + "list-label-modifiedAt": "Azkenekoz ikusita", + "list-label-title": "Zerrendaren izena", "list-label-sort": "Your Manual Order", "list-label-short-modifiedAt": "(L)", "list-label-short-title": "(N)", "list-label-short-sort": "(M)", "filter": "Iragazi", - "filter-cards": "Filter Cards or Lists", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", - "list-filter-label": "Filter List by Title", + "filter-cards": "Zerrendako txartelak iragazi", + "filter-dates-label": "Iragazi dataren arabera", + "filter-no-due-date": "Epemugarik ez", + "filter-overdue": "Atzeratuta", + "filter-due-today": "Gaurko", + "filter-due-this-week": "Aste honetarako", + "filter-due-tomorrow": "Biharko", + "list-filter-label": "Iragazi zerrenda tituluaren arabera", "filter-clear": "Garbitu iragazkia", - "filter-labels-label": "Filter by label", + "filter-labels-label": "Iragazi etiketaren arabera", "filter-no-label": "Etiketarik ez", - "filter-member-label": "Filter by member", + "filter-member-label": "Iragazi kidearen arabera", "filter-no-member": "Kiderik ez", - "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-assignee-label": "Iragazi esleipenaren arabera", + "filter-no-assignee": "Esleitu gabe", + "filter-custom-fields-label": "Iragazi eremu pertsonalizatuen arabera", + "filter-no-custom-fields": "Eremu pertsonalizaturik ez", + "filter-show-archive": "Erakutsi gordetako zerrendak", + "filter-hide-empty": "Ezkutatu hutsik dauden zerrendak", "filter-on": "Iragazkia gaituta dago", "filter-on-desc": "Arbel honetako txartela iragazten ari zara. Egin klik hemen iragazkia editatzeko.", "filter-to-selection": "Iragazketa aukerara", - "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", + "other-filters-label": "Beste iragazkiak", + "advanced-filter-label": "Iragazte aurreratua", + "advanced-filter-description": "Iragazki aurreratuak operadoreak dituen kate bat idazteko aukera ematen du: == != <= >= && || ( ) Eragileen arteko bereizle gisa espazio bat erabiltzen da. Eremu pertsonalizatu guztiak iragazi ditzakezu haien izenak eta balioak idatziz. Adibidez: Eremua1 == Balioa1. Oharra: eremuek edo balioek zuriuneak badituzte, komatxo bakarrean bildu behar dituzu. Adibidez: 'Eremua 1' == 'Balioa 1'. Kontrol-karaktere bakarrak (' \\/) saltatzeko, \\ erabil dezakezu. Adibidez: Field1 == I\\'m. Gainera, hainbat baldintza konbina ditzakezu. Adibidez: F1 == V1 || F1 == V2. Normalean operadore guztiak ezkerretik eskuinera interpretatzen dira. Ordena alda dezakezu parentesi jarriz. Adibidez: F1 == V1 && ( F2 == V2 || F2 == V3 ). Testu-eremuak ere bilatu ditzakezu regex erabiliz: F1 == /Tes.*/i\n\n\n", "fullname": "Izen abizenak", "header-logo-title": "Itzuli zure arbelen orrira.", "hide-system-messages": "Ezkutatu sistemako mezuak", @@ -409,12 +421,12 @@ "home": "Hasiera", "import": "Inportatu", "impersonate-user": "Impersonate user", - "link": "Link", + "link": "Esteka", "import-board": "inportatu arbela", "import-board-c": "Inportatu arbela", "import-board-title-trello": "Inportatu arbela Trellotik", - "import-board-title-wekan": "Import board from previous export", - "import-board-title-csv": "Import board from CSV/TSV", + "import-board-title-wekan": "Inportatu arbela aurrez egindako esportazio batetik", + "import-board-title-csv": "Inportatu arbela CSV/TSV-tik", "from-trello": "Trellotik", "from-wekan": "From previous export", "from-csv": "From CSV/TSV", @@ -448,8 +460,8 @@ "leave-board-pop": "Ziur zaude __boardTitle__ utzi nahi duzula? Arbel honetako txartel guztietatik ezabatua izango zara.", "leaveBoardPopup-title": "Arbela utzi?", "link-card": "Lotura txartel honetara", - "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-archive-cards": "Eraman zerrendako txartel guztiak biltegira", + "list-archive-cards-pop": "Honek arbeleko zerrenda horren txartel guztiak kenduko ditu. Biltegiko txartelak ikusi eta atzera arbelera eramateko klikatu \"Menua\" > \"Biltegia\".", "list-move-cards": "Lekuz aldatu zerrendako txartel guztiak", "list-select-cards": "Aukeratu zerrenda honetako txartel guztiak", "set-color-list": "Set Color", @@ -460,13 +472,13 @@ "swimlaneActionPopup-title": "Swimlane Actions", "swimlaneAddPopup-title": "Add a Swimlane below", "listImportCardPopup-title": "Inportatu Trello txartel bat", - "listImportCardsTsvPopup-title": "Import Excel CSV/TSV", + "listImportCardsTsvPopup-title": "Inportatu Excel CSV/TSV", "listMorePopup-title": "Gehiago", "link-list": "Lotura zerrenda honetara", "list-delete-pop": "Ekintza guztiak ekintza jariotik kenduko dira eta ezin izango duzu zerrenda berreskuratu. Ez dago desegiterik.", - "list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.", + "list-delete-suggest-archive": "Eraman ahal duzu zerrenda bat biltegira arbeletik kentzeko aktibitatea mantentzen.", "lists": "Zerrendak", - "swimlanes": "Swimlanes", + "swimlanes": "Errailak", "log-out": "Itxi saioa", "log-in": "Hasi saioa", "loginPopup-title": "Hasi saioa", @@ -486,9 +498,9 @@ "muted-info": "Ez zaizkizu jakinaraziko arbel honi egindako aldaketak", "my-boards": "Nire arbelak", "name": "Izena", - "no-archived-cards": "No cards in Archive.", - "no-archived-lists": "No lists in Archive.", - "no-archived-swimlanes": "No swimlanes in Archive.", + "no-archived-cards": "Biltegian ez dago txartelik.", + "no-archived-lists": " Biltegian ez dago zerrendarik.", + "no-archived-swimlanes": "Biltegian ez dago errailik.", "no-results": "Emaitzarik ez", "normal": "Arrunta", "normal-desc": "Txartelak ikusi eta editatu ditzake. Ezin ditu ezarpenak aldatu.", @@ -525,7 +537,7 @@ "save": "Gorde", "search": "Bilatu", "rules": "Rules", - "search-cards": "Search from card/list titles, descriptions and custom fields on this board", + "search-cards": "Bilatu arbel honetako txartel/zerrenden tituluetan, deskripzioetan eta eremu pertsonalizatuetan", "search-example": "Write text you search and press Enter", "select-color": "Aukeratu kolorea", "select-board": "Select Board", @@ -576,9 +588,9 @@ "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": "Erabiltzaile-izena", - "import-usernames": "Import Usernames", + "import-usernames": "Inportatu erabiltzaile-izenak", "view-it": "Ikusi", - "warn-list-archived": "warning: this card is in an list at Archive", + "warn-list-archived": "abisua: txartel hau biltegiko zerrenda batean dago", "watch": "Ikuskatu", "watching": "Ikuskatzen", "watching-info": "Arbel honi egindako aldaketak jakinaraziko zaizkizu", @@ -586,9 +598,9 @@ "welcome-swimlane": "Milestone 1", "welcome-list1": "Oinarrizkoa", "welcome-list2": "Aurreratua", - "card-templates-swimlane": "Card Templates", - "list-templates-swimlane": "List Templates", - "board-templates-swimlane": "Board Templates", + "card-templates-swimlane": "Txartel txantiloiak", + "list-templates-swimlane": "Zerrenda txantiloiak", + "board-templates-swimlane": "Arbel txantiloiak", "what-to-do": "Zer egin nahi duzu?", "wipLimitErrorPopup-title": "Baliogabeko WIP muga", "wipLimitErrorPopup-dialog-pt1": "Zerrenda honetako atazen muga, WIP-en ezarritakoa baina handiagoa da", @@ -624,7 +636,7 @@ "outgoing-webhooks": "Irteerako Webhook-ak", "bidirectional-webhooks": "Two-Way Webhooks", "outgoingWebhooksPopup-title": "Irteerako Webhook-ak", - "boardCardTitlePopup-title": "Card Title Filter", + "boardCardTitlePopup-title": "Txartelen tituluen iragazkia", "disable-webhook": "Disable This Webhook", "global-webhook": "Global Webhooks", "new-outgoing-webhook": "Irteera-webhook berria", @@ -647,15 +659,18 @@ "hours": "ordu", "minutes": "minutu", "seconds": "segundo", - "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", + "show-field-on-card": "Erakutsi eremu hau txartelean", + "automatically-field-on-card": "Gehitu eremua txartel berrietan", + "always-field-on-card": "Gehitu eremua txartel guztietan", + "showLabel-field-on-card": "Erakutsi eremuen etiketa minitxateletan", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Bai", "no": "Ez", "accounts": "Kontuak", "accounts-allowEmailChange": "Baimendu e-mail aldaketa", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Noiz sortua", "modifiedAt": "Modified at", "verified": "Egiaztatuta", @@ -672,27 +687,27 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "Assigned By", "requested-by": "Requested By", - "card-sorting-by-number": "Card sorting by number", - "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.", + "card-sorting-by-number": "Ordenatu txartelak zenbakiaren arabera", + "board-delete-notice": "Behin betiko ezabatzen du. Zerrenda guztiak, txartelak eta arbel honi lotutako aktibitate guztiak galduko dituzu.", + "delete-board-confirm-popup": "Zerrenda, txartel eta aktibitate guztiak ezabatuko dira eta ezingo dituzu berreskuratu arbelaren edukiak. Atzera bueltarik ez du.", "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:", + "subtask-settings": "Azpiatazaren ezarpenak", + "card-settings": "Txartelaren ezarpenak", + "boardSubtaskSettingsPopup-title": "Arbeleko azpiatazaren ezarpenak", + "boardCardSettingsPopup-title": "Txartelaren ezarpenak", + "deposit-subtasks-board": "Ipini azpiatazak arbel honetan:", "deposit-subtasks-list": "Landing list for subtasks deposited here:", - "show-parent-in-minicard": "Show parent in minicard:", + "show-parent-in-minicard": "Erakutsi gurasoa minitxartelean:", "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", + "change-card-parent": "Aldatu txartelaren gurasoa", + "parent-card": "Guraso-txartela", "source-board": "Source board", "no-parent": "Don't show parent", "activity-added-label": "added label '%s' to %s", @@ -725,8 +740,8 @@ "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-archived": "Biltegira eraman da", + "r-unarchived": "Biltegitik berreskuratu da", "r-a-card": "a card", "r-when-a-label-is": "When a label is", "r-when-the-label": "When the label", @@ -743,23 +758,23 @@ "r-when-the-item": "When the checklist item", "r-checked": "Checked", "r-unchecked": "Unchecked", - "r-move-card-to": "Move card to", + "r-move-card-to": "Eraman txartela hona:", "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-archive": "Eraman biltegira", + "r-unarchive": "Biltegitik berreskuratu", + "r-card": "txartela", "r-add": "Gehitu", "r-remove": "Remove", "r-label": "label", "r-member": "member", - "r-remove-all": "Remove all members from the card", + "r-remove-all": "Kendu txarteleko kide guztiak", "r-set-color": "Set color to", - "r-checklist": "checklist", + "r-checklist": "kontrol-zerrenda", "r-check-all": "Check all", "r-uncheck-all": "Uncheck all", - "r-items-check": "items of checklist", + "r-items-check": "kontrol-zerrendaren elementuak", "r-check": "Check", "r-uncheck": "Uncheck", "r-item": "item", @@ -769,19 +784,19 @@ "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-move-to-top-gen": "Eraman txartela zerrenda honen goiko aldera", + "r-d-move-to-top-spec": "Eraman txartela zerrendaren goiko aldera", + "r-d-move-to-bottom-gen": "Eraman txartela zerrenda honen beheko aldera", + "r-d-move-to-bottom-spec": "Eraman txartela zerrendaren beheko aldera", "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-archive": "Eraman txartela biltegira", + "r-d-unarchive": "Berreskuratu txartela biltegitik", "r-d-add-label": "Add label", "r-d-remove-label": "Remove label", - "r-create-card": "Create new card", + "r-create-card": "Sortu txartel berria", "r-in-list": "in list", "r-in-swimlane": "in swimlane", "r-d-add-member": "Add member", @@ -792,17 +807,17 @@ "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-d-add-checklist": "Gehitu kontrol-zerrenda", + "r-d-remove-checklist": "Kendu kontrol-zerrenda", "r-by": "by", - "r-add-checklist": "Add checklist", + "r-add-checklist": "Gehitu kontrol-zerrenda", "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-checklist-note": "Oharra: kontrol-zerrendaren elementuak idatzi behar dira koma bidez bereizita.", + "r-when-a-card-is-moved": "Txartela beste zerrendara eramatean", "r-set": "Set", "r-update": "Update", "r-datefield": "date field", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -857,12 +873,12 @@ "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", "accounts-allowUserDelete": "Allow users to self delete their account", - "hide-minicard-label-text": "Hide minicard label text", + "hide-minicard-label-text": "Ezkutatu minitxartelaren etiketaren testua", "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", + "show-on-card": "Erakutsi txartelan", "new": "New", "editOrgPopup-title": "Edit Organization", "newOrgPopup-title": "New Organization", @@ -891,12 +907,12 @@ "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", + "archived": "Gordeta", + "delete-linked-card-before-this-card": "Ezin duzu txartel hau ezabatu estekatuta dituen txartelak ezabatu arte", + "delete-linked-cards-before-this-list": "Ezin duzu zerrenda hau ezabatu honen txarteleei estekatutako txartelak ezabatu arte", "hide-checked-items": "Hide checked items", - "task": "Task", - "create-task": "Create Task", + "task": "Ataza", + "create-task": "Sortu ataza", "ok": "OK", "organizations": "Organizations", "teams": "Teams", @@ -904,32 +920,32 @@ "shortName": "Short Name", "website": "Website", "person": "Person", - "my-cards": "My Cards", - "card": "Card", + "my-cards": "Nire txartelak", + "card": "Txartela", "board": "Board", "context-separator": "/", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-title": "Ordenatu nire txartelak", + "myCardsSortChangePopup-title": "Ordenatu nire txartelak", "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", + "dueCards-title": "Txartelen epemuga", + "dueCardsViewChange-title": "Txartelen epemugen ikuspegia", + "dueCardsViewChangePopup-title": "Txartelen epemugen ikuspegia", "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", + "dueCardsViewChange-choice-all-description": "Erabiltzaileak baimena duen arbeletako *Epemuga* data duten txartel osatugabe guztiak erakusten ditu.", + "broken-cards": "Puskatutako txartelak", "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.", + "comment-not-found": "Ez da aurkitu '%s' testua iruzkinetan duen txartelik..", "globalSearch-title": "Search All Boards", - "no-cards-found": "No Cards Found", - "one-card-found": "One Card Found", - "n-cards-found": "%s Cards Found", + "no-cards-found": "Ez da txartelik aurkitu", + "one-card-found": "Txartel bat aurkitu da", + "n-cards-found": "%s txartel aurkitu dira", "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", "operator-board": "board", "operator-board-abbrev": "b", @@ -954,7 +970,7 @@ "operator-comment": "comment", "operator-has": "has", "operator-limit": "limit", - "predicate-archived": "archived", + "predicate-archived": "gordeta", "predicate-open": "open", "predicate-ended": "ended", "predicate-all": "all", @@ -968,7 +984,7 @@ "predicate-created": "created", "predicate-attachment": "attachment", "predicate-description": "description", - "predicate-checklist": "checklist", + "predicate-checklist": "kontrol-zerrenda", "predicate-start": "start", "predicate-end": "end", "predicate-assignee": "assignee", @@ -1015,15 +1031,15 @@ "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.", + "globalSearch-instructions-notes-5": "Berez, gordetako txartelak ez dira bilatzen", "link-to-search": "Link to this search", "excel-font": "Arial", - "number": "Number", + "number": "Zenbakia", "label-colors": "Label Colors", "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "cardsSortPopup-title": "Sort Cards", + "archived-at": "hemen gordeta:", + "sort-cards": "Ordenatu txartelak", + "cardsSortPopup-title": "Ordenatu txartelak", "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`", @@ -1035,7 +1051,7 @@ "now-system-messages-of-all-users-are-hidden": "Now system messages of all users are hidden", "move-swimlane": "Move Swimlane", "moveSwimlanePopup-title": "Move Swimlane", - "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate": "Kate txantiloia", "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", "custom-field-stringtemplate-separator": "Separator (use or   for a space)", "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", @@ -1046,7 +1062,7 @@ "rulesReportTitle": "Rules Report", "copy-swimlane": "Copy Swimlane", "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", + "display-card-creator": "Erakutsi txartelaren sortzailea", "wait-spinner": "Wait Spinner", "Bounce": "Bounce Wait Spinner", "Cube": "Cube Wait Spinner", @@ -1056,8 +1072,58 @@ "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", + "maximize-card": "Maximizatu txartela", + "minimize-card": "Minimizatu txartela", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Txartelaren zehetasunak", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Iragazi txartelaren tituluaren arabera", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/fa-IR.i18n.json b/i18n/fa-IR.i18n.json index adbd476c0..f70394d22 100644 --- a/i18n/fa-IR.i18n.json +++ b/i18n/fa-IR.i18n.json @@ -81,21 +81,22 @@ "activity-endDate": "edited end date to %s of %s", "add-attachment": "Add Attachment", "add-board": "Add Board", - "add-template": "Add Template", + "add-template": "اضافه کردن قالب", "add-card": "Add Card", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "اضافه کردن کارت به بالای لیست", + "add-card-to-bottom-of-list": "اضافه کردن کارت به پایین لیست", "add-swimlane": "Add Swimlane", "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "تبدیل به کارت", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List", "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -137,7 +139,7 @@ "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>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "برای مرتب سازی آیکونهای تخته درگ دراپ کنید.\nبرای باز کردن تخته روی آیکون کلیک کنید.", "boardChangeColorPopup-title": "Change Board Background", "boardChangeTitlePopup-title": "Rename Board", "boardChangeVisibilityPopup-title": "Change Visibility", @@ -159,6 +161,8 @@ "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-archive-pop": "کارت بعد از آرشیو کردن در این لیست نمایش داده نخواهد شد.", + "card-archive-suggest-cancel": "بعداً میتوانید کارت را از آرشیو بازگردانید.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -199,7 +203,7 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", + "poker-finish": "پایان", "poker-result-votes": "Votes", "poker-result-who": "Who", "poker-replay": "Replay", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/fa.i18n.json b/i18n/fa.i18n.json index 93937a9c7..d5c91a136 100644 --- a/i18n/fa.i18n.json +++ b/i18n/fa.i18n.json @@ -96,6 +96,7 @@ "add-members": "افزودن اعضا", "added": "اضافه گردید", "addMemberPopup-title": "اعضا", + "memberPopup-title": "تنظیمات اعضا", "admin": "مدیر", "admin-desc": "امکان دیدن و ویرایش کارت‌ها، حذف اعضا و تغییرِ تنظیماتِ برد.", "admin-announcement": "اعلان", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "و __count__ کارت دیگر", "apply": "اعمال", "app-is-offline": "در حال بارگزاری لطفا منتظر بمانید. بازخوانی صفحه باعث از بین رفتن اطلاعات می شود. اگر بارگذاری کار نمی کند، لطفا بررسی کنید که این سرور متوقف نشده است.", + "app-try-reconnect": "Try to reconnect.", "archive": "انتقال به آرشیو", "archive-all": "انتقال همه به آرشیو", "archive-board": "انتقال برد به آرشیو", @@ -159,6 +161,8 @@ "card-delete-notice": "حذف دائمی. تمامی موارد مرتبط با این کارت از بین خواهند رفت.", "card-delete-pop": "همه اقدامات از این پردازه حذف خواهد شد و امکان بازگرداندن کارت وجود نخواهد داشت.", "card-delete-suggest-archive": "شما می توانید کارت را به بایگانی منتقل کنید تا آن را از هیئت مدیره حذف کنید و فعالیت را حفظ کنید.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "موعد", "card-due-on": "موعد تا", "card-spent": "زمان صرف شده", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "آیا می خواهید کارت را حذف کنید؟", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "اعمال کارت", "cardLabelsPopup-title": "لیبل ها", "cardMembersPopup-title": "اعضا", @@ -268,14 +273,18 @@ "comment-placeholder": "درج نظر", "comment-only": "فقط نظر", "comment-only-desc": "فقط می‌تواند روی کارت‌ها نظر دهد.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "هیچ کامنتی موجود نیست", "no-comments-desc": "نظرات و فعالیت ها را نمی توان دید.", "worker": "کارگر", "worker-desc": "تنها می‌توانید کارت‌ها را جابجا کنید، آنها را به خود محول کنید و نظر دهید.", "computer": "رایانه", "confirm-subtask-delete-dialog": "از حذف این زیر وظیفه اطمینان دارید؟", - "confirm-checklist-delete-dialog": "آیا مطمئنید می‌خواهید چک‌لیست را حذف کنید؟", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "درج پیوند کارت در حافظه", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "ارتباط دادن کارت", "searchElementPopup-title": "جستجو", "copyCardPopup-title": "کپی کارت", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "تغییر تاریخ آغاز", "editCardDueDatePopup-title": "تغییر تاریخ پایان", "editCustomFieldPopup-title": "ویرایش فیلد", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "تغییر زمان صرف شده", "editLabelPopup-title": "تغیر لیبل", "editNotificationPopup-title": "اصلاح اعلان", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "انتقال به بیرون برد", "exportCardPopup-title": "Export card", "sort": "مرتب سازی", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "برای مرتب سازی لیست کلیک کنید", "list-sort-by": "مرتب سازی لیست بر اساس:", "list-label-modifiedAt": "زمان دسترسی قبلی", @@ -651,11 +663,14 @@ "automatically-field-on-card": "افزودن فیلد به کارت های جدید", "always-field-on-card": "افزودن فیلد به همه کارت ها", "showLabel-field-on-card": "نمایش لیبل فیلد در کارت‌های کوچک", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "بله", "no": "خیر", "accounts": "حساب‌ها", "accounts-allowEmailChange": "اجازه تغییر ایمیل", "accounts-allowUserNameChange": "اجازه تغییر نام کاربری", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "ساخته شده در", "modifiedAt": "تغییر یافته در", "verified": "معتبر", @@ -825,6 +840,7 @@ "error-undefined": "یک اشتباه رخ داده شده است", "error-ldap-login": "هنگام تلاش برای ورود به یک خطا رخ داد", "display-authentication-method": "نمایش نوع اعتبارسنجی", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "نوع اعتبارسنجی پیشفرض", "duplicate-board": "برد تکراری", "org-number": "تعداد سازمان ها", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "حذف", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/fi.i18n.json b/i18n/fi.i18n.json index 0c37889a2..420e22664 100644 --- a/i18n/fi.i18n.json +++ b/i18n/fi.i18n.json @@ -96,6 +96,7 @@ "add-members": "Lisää jäseniä", "added": "Lisätty", "addMemberPopup-title": "Jäsenet", + "memberPopup-title": "Jäsenasetukset", "admin": "Ylläpitäjä", "admin-desc": "Voi nähdä ja muokata kortteja, poistaa jäseniä, ja muuttaa taulun asetuksia.", "admin-announcement": "Ilmoitus", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Ja __count__ muuta korttia", "apply": "Käytä", "app-is-offline": "Ladataan, odota. Sivun uudelleenlataus aiheuttaa tietojen menettämisen. Jos lataaminen ei toimi, tarkista että palvelin ei ole pysähtynyt.", + "app-try-reconnect": "Yritä muodostaa yhteys uudelleen.", "archive": "Siirrä Arkistoon", "archive-all": "Siirrä kaikki Arkistoon", "archive-board": "Siirrä taulu Arkistoon", @@ -159,6 +161,8 @@ "card-delete-notice": "Poistaminen on lopullista. Menetät kaikki tähän korttiin liitetyt toimet.", "card-delete-pop": "Kaikki toimet poistetaan toimintasyötteestä, etkä pysty avata korttia uudelleen. Tätä ei voi peruuttaa.", "card-delete-suggest-archive": "Voit siirtää kortin Arkistoon poistaaksesi sen taululta ja säilyttääksesi toimintalokin.", + "card-archive-pop": "Kortti ei enää näy tässä listassa arkistoinnin jälkeen.", + "card-archive-suggest-cancel": "Voit myöhemmin palauttaa kortin Arkistosta.", "card-due": "Erääntyy", "card-due-on": "Erääntyy", "card-spent": "Käytetty aika", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Poista suunnittelupokeri?", "poker-delete-pop": "Poistaminen on lopullista. Menetät kaikki tähän suunnittelupokeriin liitetyt toimet.", "cardDeletePopup-title": "Poista kortti?", + "cardArchivePopup-title": "Arkistoi kortti?", "cardDetailsActionsPopup-title": "Korttitoimet", "cardLabelsPopup-title": "Nimilaput", "cardMembersPopup-title": "Jäsenet", @@ -268,14 +273,18 @@ "comment-placeholder": "Kirjoita kommentti", "comment-only": "Vain kommentointi", "comment-only-desc": "Voi vain kommentoida kortteja", + "comment-delete": "Haluatko varmasti poistaa kommentin?", + "deleteCommentPopup-title": "Poista kommentti?", "no-comments": "Ei kommentteja", "no-comments-desc": "Ei voi nähdä kommentteja ja toimintaa.", "worker": "Työntekijä", "worker-desc": "Voi vain siirtää kortteja, ilmoittautua kortin käsittelijäksi ja kommentoida.", "computer": "Tietokone", "confirm-subtask-delete-dialog": "Haluatko varmasti poistaa alitehtävän?", - "confirm-checklist-delete-dialog": "Haluatko varmasti poistaa tarkistuslistan?", + "confirm-checklist-delete-popup": "Haluatko varmasti poistaa tarkistuslistan?", + "checklistDeletePopup-title": "Poista tarkistuslista?", "copy-card-link-to-clipboard": "Kopioi kortin linkki leikepöydälle", + "copy-text-to-clipboard": "Kopioi teksti leikepöydälle", "linkCardPopup-title": "Linkitä kortti", "searchElementPopup-title": "Etsi", "copyCardPopup-title": "Kopioi kortti", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Muokkaa aloituspäivää", "editCardDueDatePopup-title": "Muokkaa eräpäivää", "editCustomFieldPopup-title": "Muokkaa kenttää", + "addReactionPopup-title": "Lisää reaktio", "editCardSpentTimePopup-title": "Muuta käytettyä aikaa", "editLabelPopup-title": "Muokkaa nimilappua", "editNotificationPopup-title": "Muokkaa ilmoituksia", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Vie taulu", "exportCardPopup-title": "Vie kortti", "sort": "Lajittele", + "sorted": "Lajiteltu", + "remove-sort": "Poista lajittelu", "sort-desc": "Klikkaa lajitellaksesi listan", "list-sort-by": "Lajittele lista:", "list-label-modifiedAt": "Viimeinen käyttöaika", @@ -384,7 +396,7 @@ "filter-due-today": "Erääntyy tänään", "filter-due-this-week": "Erääntyy tällä viikolla", "filter-due-tomorrow": "Erääntyy huomenna", - "list-filter-label": "Suodata listat otsikon mukaan", + "list-filter-label": "Suodata listan otsikko", "filter-clear": "Poista suodatin", "filter-labels-label": "Suodata nimilappu", "filter-no-label": "Ei nimilappua", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Lisää kenttä uusille korteille", "always-field-on-card": "Lisää kenttä kaikille korteille", "showLabel-field-on-card": "Näytä kentän nimilappu minikortilla", + "showSum-field-on-list": "Näytä kenttien summa listan yläosassa", "yes": "Kyllä", "no": "Ei", "accounts": "Tilit", "accounts-allowEmailChange": "Salli sähköpostiosoitteen muuttaminen", "accounts-allowUserNameChange": "Salli käyttäjätunnuksen muuttaminen", + "tableVisibilityMode-allowPrivateOnly": "Taulujen näkyvyys: Salli vain yksityiset taulut", + "tableVisibilityMode": "Taulujen näkyvyys", "createdAt": "Luotu", "modifiedAt": "Muokattu", "verified": "Varmistettu", @@ -825,6 +840,7 @@ "error-undefined": "Jotain meni pieleen", "error-ldap-login": "Virhe tapahtui yrittäessä kirjautua sisään", "display-authentication-method": "Näytä kirjautumistapa", + "oidc-button-text": "Muokkaa OIDC kirjautumispainikkeen tekstiä", "default-authentication-method": "Oletuskirjautumistapa", "duplicate-board": "Tee kaksoiskappale taulusta", "org-number": "Organisaatioiden määrä on:", @@ -1059,5 +1075,55 @@ "maximize-card": "Suurenna kortti", "minimize-card": "Pienennä kortti", "delete-org-warning-message": "Ei voi poistaa tätä organisaatiota, ainakin yksi käyttäjä kuuluu siihen", - "delete-team-warning-message": "Ei voi poistaa tätä tiimiä, ainakin yksi käyttäjä kuuluu siihen" + "delete-team-warning-message": "Ei voi poistaa tätä tiimiä, ainakin yksi käyttäjä kuuluu siihen", + "subject": "Aihe", + "details": "Yksityiskohdat", + "carbon-copy": "Kopio (Cc:)", + "ticket": "Tiketti", + "tickets": "Tiketit", + "ticket-number": "Tiketti numero", + "open": "Avoinna", + "pending": "Odottaa", + "closed": "Suljettu", + "resolved": "Ratkaistu", + "cancelled": "Peruutettu", + "history": "Historia", + "request": "Pyyntö", + "requests": "Pyynnöt", + "help-request": "Avunpyyntö", + "editCardSortOrderPopup-title": "Muuta lajittelua", + "cardDetailsPopup-title": "Kortin yksityiskohdat", + "add-teams": "Lisää tiimejä", + "add-teams-label": "Lisätyt tiimit näkyy tässä alla:", + "remove-team-from-table": "Haluatko varmasti poistaa tämän tiimin taululta?", + "confirm-btn": "Varmista", + "remove-btn": "Poista", + "filter-card-title-label": "Suodata kortin otsikko", + "invite-people-success": "Kutsu rekisteröityä lähetetty onnistuneesti", + "invite-people-error": "Virhe lähetettäessä kutsua rekisteröityä", + "can-invite-if-same-mailDomainName": "Sähköposti verkkotunnuksen nimi", + "to-create-teams-contact-admin": "Luodaksesi tiimejä, ota yhteyttä ylläpitäjään.", + "Node_heap_total_heap_size": "Node keko: keon kokonaiskoko", + "Node_heap_total_heap_size_executable": "Node keko: suoritettava keon kokonaiskoko", + "Node_heap_total_physical_size": "Node keko: fyysinen kokonaiskoko", + "Node_heap_total_available_size": "Node keko: käytettävissä oleva koko", + "Node_heap_used_heap_size": "Node keko: käytetty keon koko", + "Node_heap_heap_size_limit": "Node keko: keon kokorajoitus", + "Node_heap_malloced_memory": "Node keko: malloc muisti", + "Node_heap_peak_malloced_memory": "Node keko: virheellisen malloc muistin huippu", + "Node_heap_does_zap_garbage": "Node keko: kerää roskat", + "Node_heap_number_of_native_contexts": "Node keko: natiivikontekstien lukumäärä", + "Node_heap_number_of_detached_contexts": "Node keko: irrotettujen kontekstien määrä", + "Node_memory_usage_rss": "Node muistin käyttö: pysyväksi asetettu koko", + "Node_memory_usage_heap_total": "Node muistin käyttö: varattu keon kokonaiskoko", + "Node_memory_usage_heap_used": "Node muistin käyttö: todellinen käytetty muisti", + "Node_memory_usage_external": "Node muistin käyttö: ulkoinen", + "add-organizations": "Lisää organisaatioita", + "add-organizations-label": "Lisätyt organisaatiot näkyy tässä alla:", + "remove-organization-from-board": "Haluatko varmasti poistaa tämän organisaation tältä taululta ?", + "to-create-organizations-contact-admin": "Luodaksesi organisaatioita, ota yhteyttä ylläpitäjään.", + "custom-legal-notice-link-url": "Muokatun oikeudellisen huomautuksen sivun URL", + "acceptance_of_our_legalNotice": "Jatkamalla hyväksyt meidän", + "legalNotice": "oikeudellisen huomautuksen", + "copied": "Kopioitu!" } \ No newline at end of file diff --git a/i18n/fr-CH.i18n.json b/i18n/fr-CH.i18n.json new file mode 100644 index 000000000..6ba6343be --- /dev/null +++ b/i18n/fr-CH.i18n.json @@ -0,0 +1,1129 @@ +{ + "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-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "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.", + "app-try-reconnect": "Try to reconnect.", + "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", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "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>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "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.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "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.", + "close-card": "Close Card", + "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.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "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-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text 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", + "addReactionPopup-title": "Add reaction", + "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", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove 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", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "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", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization 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", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "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", + "card-sorting-by-number": "Card sorting by number", + "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", + "oidc-button-text": "Customize the OIDC button text", + "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.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? 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-creator": "creator", + "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-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "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", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" +} \ No newline at end of file diff --git a/i18n/fr.i18n.json b/i18n/fr.i18n.json index cc8d51716..eb1dc855f 100644 --- a/i18n/fr.i18n.json +++ b/i18n/fr.i18n.json @@ -96,6 +96,7 @@ "add-members": "Assigner des participants", "added": "Ajouté le", "addMemberPopup-title": "Participants", + "memberPopup-title": "Préférence du participant", "admin": "Admin", "admin-desc": "Peut voir et éditer les cartes, supprimer des participants et changer les paramètres du tableau.", "admin-announcement": "Annonce", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Et __count__ autres cartes", "apply": "Appliquer", "app-is-offline": "Chargement en cours, veuillez patienter. Vous risquez de perdre des données si vous rechargez la page. Si le chargement échoue, veuillez vérifier que le serveur n'est pas arrêté.", + "app-try-reconnect": "Essayer de se reconnecter.", "archive": "Archiver", "archive-all": "Tout archiver", "archive-board": "Archiver le tableau", @@ -126,7 +128,7 @@ "assign-member": "Affecter un participant", "attached": "joint", "attachment": "Pièce jointe", - "attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Elle ne peut être annulée.", + "attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Cela est irréversible.", "attachmentDeletePopup-title": "Supprimer la pièce jointe ?", "attachments": "Pièces jointes", "auto-watch": "Surveiller automatiquement les tableaux quand ils sont créés", @@ -157,8 +159,10 @@ "board-archived": "Ce tableau est archivé", "card-comments-title": "Cette carte a %s commentaires.", "card-delete-notice": "La suppression est définitive. Vous perdrez toutes les actions associées à cette carte.", - "card-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser cette carte. Cette action est irréversible.", + "card-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser cette carte. Cela est irréversible.", "card-delete-suggest-archive": "Vous pouvez déplacer une carte vers les archives afin de l'enlever du tableau tout en préservant l'activité.", + "card-archive-pop": "La carte ne sera plus visible dans cette liste après archivage.", + "card-archive-suggest-cancel": "Vous pouvez, plus tard, restaurer une carte depuis les archives.", "card-due": "À échéance", "card-due-on": "Échéance le", "card-spent": "Temps passé", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Supprimer ce planning poker ?", "poker-delete-pop": "La suppression est définitive. Vous perdrez toutes les actions associées à ce planning poker.", "cardDeletePopup-title": "Supprimer la carte ?", + "cardArchivePopup-title": "Archiver la carte ?", "cardDetailsActionsPopup-title": "Actions sur la carte", "cardLabelsPopup-title": "Étiquettes", "cardMembersPopup-title": "Participants", @@ -268,14 +273,18 @@ "comment-placeholder": "Écrire un commentaire", "comment-only": "Commentaire uniquement", "comment-only-desc": "Ne peut que commenter des cartes.", + "comment-delete": "Êtes-vous sûr de vouloir supprimer le commentaire ?", + "deleteCommentPopup-title": "Supprimer le commentaire ?", "no-comments": "Aucun commentaire", "no-comments-desc": "Ne peut pas voir les commentaires et les activités.", "worker": "Travailleur", "worker-desc": "Peut seulement déplacer des cartes, s'assigner à une carte et la commenter.", "computer": "Ordinateur", "confirm-subtask-delete-dialog": "Êtes-vous sûr de vouloir supprimer la sous-tâche ?", - "confirm-checklist-delete-dialog": "Êtes-vous sûr de vouloir supprimer la checklist ?", + "confirm-checklist-delete-popup": "Êtes-vous sûr de vouloir supprimer la checklist ?", + "checklistDeletePopup-title": "Supprimer la checklist ?", "copy-card-link-to-clipboard": "Copier le lien vers la carte dans le presse-papier", + "copy-text-to-clipboard": "Copier le texte dans le presse-papier", "linkCardPopup-title": "Lier une Carte", "searchElementPopup-title": "Chercher", "copyCardPopup-title": "Copier la carte", @@ -289,7 +298,7 @@ "createCustomField": "Créer un champ personnalisé", "createCustomFieldPopup-title": "Créer un champ personnalisé", "current": "actuel", - "custom-field-delete-pop": "Cette action n'est pas réversible. Elle supprimera ce champ personnalisé de toutes les cartes et détruira son historique.", + "custom-field-delete-pop": "Cette action est irréversible. Elle supprimera ce champ personnalisé de toutes les cartes et détruira son historique.", "custom-field-checkbox": "Case à cocher", "custom-field-currency": "Devise", "custom-field-currency-option": "Code devise", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Modifier la date de début", "editCardDueDatePopup-title": "Modifier la date d'échéance", "editCustomFieldPopup-title": "Éditer le champ personnalisé", + "addReactionPopup-title": "Ajouter une réaction", "editCardSpentTimePopup-title": "Modifier le temps passé", "editLabelPopup-title": "Modifier l'étiquette", "editNotificationPopup-title": "Modifier la notification", @@ -334,7 +344,7 @@ "email-invalid": "Adresse e-mail incorrecte.", "email-invite": "Inviter par e-mail", "email-invite-subject": "__inviter__ vous a envoyé une invitation", - "email-invite-text": "Cher __user__,\n\n__inviter__ vous invite à rejoindre le tableau \"__board__\" pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n\n__url__\n\nMerci.", + "email-invite-text": "Cher/Chère __user__,\n\n__inviter__ vous invite à rejoindre le tableau \"__board__\" pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n\n__url__\n\nMerci.", "email-resetPassword-subject": "Réinitialiser votre mot de passe sur __siteName__", "email-resetPassword-text": "Bonjour __user__,\n\nPour réinitialiser votre mot de passe, cliquez sur le lien ci-dessous.\n\n__url__\n\nMerci.", "email-sent": "Courriel envoyé", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exporter le tableau", "exportCardPopup-title": "Exporter la carte", "sort": "Tri", + "sorted": "Triées", + "remove-sort": "Ne plus trier", "sort-desc": "Cliquez pour trier la liste", "list-sort-by": "Trier la liste par:", "list-label-modifiedAt": "Dernier accès", @@ -463,7 +475,7 @@ "listImportCardsTsvPopup-title": "Importer un fichier Excel CSV/TSV", "listMorePopup-title": "Plus", "link-list": "Lien vers cette liste", - "list-delete-pop": "Toutes les actions seront supprimées du fil d'activité et il ne sera plus possible de les récupérer. Cette action est irréversible.", + "list-delete-pop": "Toutes les actions seront supprimées du fil d'activité et il ne sera plus possible de les récupérer. Cela est irréversible.", "list-delete-suggest-archive": "Vous pouvez archiver une liste pour l'enlever du tableau tout en conservant son activité.", "lists": "Listes", "swimlanes": "Couloirs", @@ -614,7 +626,7 @@ "send-smtp-test": "Envoyer un mail de test à vous-même", "invitation-code": "Code d'invitation", "email-invite-register-subject": "__inviter__ vous a envoyé une invitation", - "email-invite-register-text": "Cher __user__,\n\n__inviter__ vous invite à le rejoindre sur le tableau kanban pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n__url__\n\nVotre code d'invitation est : __icode__\n\nMerci.", + "email-invite-register-text": "Cher/Chère __user__,\n\n__inviter__ vous invite à le rejoindre sur le tableau kanban pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n__url__\n\nVotre code d'invitation est : __icode__\n\nMerci.", "email-smtp-test-subject": "E-mail de test SMTP", "email-smtp-test-text": "Vous avez envoyé un mail avec succès", "error-invitation-code-not-exist": "Ce code d'invitation n'existe pas.", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Ajouter le champ aux cartes nouvellement créées", "always-field-on-card": "Ajouter le champ à toutes les cartes", "showLabel-field-on-card": "Indiquer l'étiquette du champ sur la mini-carte", + "showSum-field-on-list": "Afficher le total des champs en haut de liste", "yes": "Oui", "no": "Non", "accounts": "Comptes", "accounts-allowEmailChange": "Autoriser le changement d'adresse mail", "accounts-allowUserNameChange": "Autoriser le changement d'identifiant", + "tableVisibilityMode-allowPrivateOnly": "Visibilité des tableaux: N'autoriser que des tableaux privés", + "tableVisibilityMode": "Visibilité des tableaux", "createdAt": "Créé le", "modifiedAt": "Modifié le", "verified": "Vérifié", @@ -674,7 +689,7 @@ "requested-by": "Demandé par", "card-sorting-by-number": "Tri numérique des cartes", "board-delete-notice": "La suppression est définitive. Vous perdrez toutes les listes, cartes et actions associées à ce tableau.", - "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Il n'y a pas d'annulation possible.", + "delete-board-confirm-popup": "Toutes les listes, cartes, étiquettes et activités seront supprimées et vous ne pourrez pas retrouver le contenu du tableau. Cela est irréversible.", "boardDeletePopup-title": "Supprimer le tableau ?", "delete-board": "Supprimer le tableau", "default-subtasks-board": "Sous-tâches du tableau __board__", @@ -726,7 +741,7 @@ "r-moved-to": "Déplacé vers", "r-moved-from": "Déplacé depuis", "r-archived": "Archivé", - "r-unarchived": "Restauré depuis l'Archive", + "r-unarchived": "Restauré depuis les archives", "r-a-card": "carte", "r-when-a-label-is": "Quand une étiquette est", "r-when-the-label": "Quand l'étiquette est", @@ -748,7 +763,7 @@ "r-bottom-of": "En bas de", "r-its-list": "sa liste", "r-archive": "Archiver", - "r-unarchive": "Restaurer depuis l'Archive", + "r-unarchive": "Restaurer depuis les archives", "r-card": "carte", "r-add": "Ajouter", "r-remove": "Supprimer", @@ -778,7 +793,7 @@ "r-d-send-email-subject": "sujet", "r-d-send-email-message": "message", "r-d-archive": "Archiver la carte", - "r-d-unarchive": "Restaurer la carte depuis l'Archive", + "r-d-unarchive": "Restaurer la carte depuis les archives", "r-d-add-label": "Ajouter une étiquette", "r-d-remove-label": "Supprimer l'étiquette", "r-create-card": "Créer une nouvelle carte", @@ -825,13 +840,14 @@ "error-undefined": "Une erreur inconnue s'est produite", "error-ldap-login": "Une erreur s'est produite lors de la tentative de connexion", "display-authentication-method": "Afficher la méthode d'authentification", + "oidc-button-text": "Personnaliser le texte du bouton OIDC", "default-authentication-method": "Méthode d'authentification par défaut", "duplicate-board": "Dupliquer le tableau", "org-number": "Le nombre d'organisations est de :", "team-number": "Le nombre d'équipes est de :", "people-number": "Le nombre d'utilisateurs est de :", "swimlaneDeletePopup-title": "Supprimer le couloir ?", - "swimlane-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser ce couloir. Cette action est irréversible.", + "swimlane-delete-pop": "Toutes les actions vont être supprimées du suivi d'activités et vous ne pourrez plus utiliser ce couloir. Cela est irréversible.", "restore-all": "Tout restaurer", "delete-all": "Tout supprimer", "loading": "Chargement, merci de patienter.", @@ -840,7 +856,7 @@ "act-a-endAt": "Modification de la date de fin de __timeOldValue__ à __timeValue__", "act-a-startAt": "Modification de la date de début de __timeOldValue__ à __timeValue__", "act-a-receivedAt": "Modification de la date de réception de __timeOldValue__ à __timeValue__", - "a-dueAt": "Echéance modifiée à ", + "a-dueAt": "Echéance modifiée à", "a-endAt": "Date de fin modifiée à", "a-startAt": "Date de début modifiée à", "a-receivedAt": "Date de réception modifiée à", @@ -853,9 +869,9 @@ "act-pastdue": "rappelle que l'échéance (__timeValue__) de __card__ est passée", "act-duenow": "rappelle que l'échéance (__timeValue__) de __card__ est maintenant", "act-atUserComment": "Vous avez été mentionné dans [__board__] __list__/__card__", - "delete-user-confirm-popup": "Êtes-vous sûr de vouloir supprimer ce compte ? Cette opération ne peut pas être annulée. ", - "delete-team-confirm-popup": "Êtes-vous sûr de vouloir supprimer cette équipe ? Cette opération ne peut pas être annulée. ", - "delete-org-confirm-popup": "Êtes-vous sûr de vouloir supprimer cette organisation ? Cette opération ne peut pas être annulée. ", + "delete-user-confirm-popup": "Êtes-vous sûr de vouloir supprimer ce compte ? Cela est irréversible.", + "delete-team-confirm-popup": "Êtes-vous sûr de vouloir supprimer cette équipe ? Cela est irréversible.", + "delete-org-confirm-popup": "Êtes-vous sûr de vouloir supprimer cette organisation ? Cela est irréversible.", "accounts-allowUserDelete": "Autoriser les utilisateurs à supprimer leur compte", "hide-minicard-label-text": "Cacher l'étiquette de la minicarte", "show-desktop-drag-handles": "Voir les poignées de déplacement du bureau", @@ -864,8 +880,8 @@ "addmore-detail": "Ajouter une description plus détaillée", "show-on-card": "Afficher sur la carte", "new": "Nouveau", - "editOrgPopup-title": "Éditer l'Organisation", - "newOrgPopup-title": "Nouvelle Organisation", + "editOrgPopup-title": "Éditer l'organisation", + "newOrgPopup-title": "Nouvelle organisation", "editTeamPopup-title": "Éditer l'Équipe", "newTeamPopup-title": "Nouvelle Équipe", "editUserPopup-title": "Éditer l'utilisateur", @@ -985,7 +1001,7 @@ "previous-page": "Page précédente", "heading-notes": "Remarques", "globalSearch-instructions-heading": "Instructions de recherche", - "globalSearch-instructions-description": "Les recherches peuvent inclure des opérateurs pour affiner le résultat. Les opérateurs sont précisés en écrivant l'opérateur suivi d'une valeur séparé par un deux-point. Par exemple, une spécification comme `liste:Bloqué` limiterait le résultat aux cartes qui contiennent une liste appelée *Bloqué*. Si la valeur contient des espaces ou des caractères spéciaux, elle doit être entourée d'apostrophes (par ex. `__operator_list__:\"À valider\"`). ", + "globalSearch-instructions-description": "Les recherches peuvent inclure des opérateurs pour affiner le résultat. Les opérateurs sont précisés en écrivant l'opérateur suivi d'une valeur séparé par un deux-point. Par exemple, une spécification comme `liste:Bloqué` limiterait le résultat aux cartes qui contiennent une liste appelée *Bloqué*. Si la valeur contient des espaces ou des caractères spéciaux, elle doit être entourée d'apostrophes (par ex. `__operator_list__:\"À valider\"`).", "globalSearch-instructions-operators": "Opérateurs disponibles :", "globalSearch-instructions-operator-board": "`__operator_board__:<titre>` - cartes dont le tableau correspond à *<titre>*", "globalSearch-instructions-operator-list": "`__operator_list__:<titre>` - cartes dont les listes correspondent à *<titre>*", @@ -1007,7 +1023,7 @@ "globalSearch-instructions-status-ended": "`__predicate_ended__` - cartes ayant une date de fin.", "globalSearch-instructions-status-public": "`__predicate_public__` - uniquement les cartes qui sont dans un tableau public.", "globalSearch-instructions-status-private": "`__predicate_private__` - uniquement les cartes qui sont dans un tableau privé.", - "globalSearch-instructions-operator-has": "`__operator_has__:<champ>` - où *<champ>* est un parmi `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` ou `__predicate_member__`. Placer un `-` au début de *<champ>* recherche l'absence de valeur dans ce champ (par exemple. __operator_has:__predicate_due` recherche les carte sans date d'échéance).", + "globalSearch-instructions-operator-has": "`__operator_has__:<champ>` - où *<champ>* est un parmi `__predicate_attachment__`, `__predicate_checklist__`, `__predicate_description__`, `__predicate_start__`, `__predicate_due__`, `__predicate_end__`, `__predicate_assignee__` ou `__predicate_member__`. Placer un `-` au début de *<champ>* recherche l'absence de valeur dans ce champ (par exemple, __operator_has:-__predicate_due` recherche les cartes sans date d'échéance).", "globalSearch-instructions-operator-sort": "`__operator_sort__:<tri>` - où *<tri>* est une méthode parmi `__predicate_due__`, `__predicate_created__` ou `__predicate_modified__`. Pour un tri descendant, préfixez la méthode par `-`.", "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - où *<n>* est un entier positif exprimant le nombre de cartes à afficher par page.", "globalSearch-instructions-notes-1": "Il est possible d'utiliser plusieurs opérateurs.", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximiser la carte", "minimize-card": "Minimiser la carte", "delete-org-warning-message": "Impossible de supprimer cette organisation, au moins un utilisateur lui appartient", - "delete-team-warning-message": "Impossible de supprimer cette équipe, au moins un utilisateur lui appartient" + "delete-team-warning-message": "Impossible de supprimer cette équipe, au moins un utilisateur lui appartient", + "subject": "Sujet", + "details": "Détails", + "carbon-copy": "Copie Carbone (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Numéro du ticket", + "open": "Ouvert", + "pending": "En cours", + "closed": "Fermé", + "resolved": "Résolu", + "cancelled": "Annulé", + "history": "Historique", + "request": "Requête", + "requests": "Requêtes", + "help-request": "Demande d'aide", + "editCardSortOrderPopup-title": "Modifier le tri", + "cardDetailsPopup-title": "Détails de la carte", + "add-teams": "Ajouter des équipes", + "add-teams-label": "Les équipes ajoutées sont affichées ci-dessous :", + "remove-team-from-table": "Voulez-vous vraiment supprimer cette équipe du tableau ?", + "confirm-btn": "Confirmer", + "remove-btn": "Supprimer", + "filter-card-title-label": "Filtrer par titre de carte", + "invite-people-success": "Invitation à s'enregistrer envoyée avec succès", + "invite-people-error": "Une erreur s'est produite lors de l'envoi de l'invitation à s'enregistrer", + "can-invite-if-same-mailDomainName": "Nom de domaine du message", + "to-create-teams-contact-admin": "Pour créer des équipes, veuillez contacter l'administrateur.", + "Node_heap_total_heap_size": "Tas de Node : taille totale du tas", + "Node_heap_total_heap_size_executable": "Tas de Node : taille totale du tas exécutable", + "Node_heap_total_physical_size": "Tas de Node : taille totale physique", + "Node_heap_total_available_size": "Tas de Node : taille totale disponible", + "Node_heap_used_heap_size": "Tas de Node : taille du tas utilisé", + "Node_heap_heap_size_limit": "Tas de Node : limite de taille du tas", + "Node_heap_malloced_memory": "Tas de Node : mémoire allouée par malloc", + "Node_heap_peak_malloced_memory": "Tas de Node : mémoire maximale allouée par malloc", + "Node_heap_does_zap_garbage": "Tas de Node : Utilise l'option does_zap_garbage", + "Node_heap_number_of_native_contexts": "Tas de Node : nombre de contexte natifs", + "Node_heap_number_of_detached_contexts": "Tas de Node : nombre de contexte détachés", + "Node_memory_usage_rss": "Utilisation mémoire de Node : taille de l'ensemble résident", + "Node_memory_usage_heap_total": "Utilisation mémoire de Node : taille totale du tas alloué", + "Node_memory_usage_heap_used": "Utilisation mémoire de Node : mémoire réellement utilisée", + "Node_memory_usage_external": "Utilisation mémoire de Node: externe", + "add-organizations": "Ajouter des organisations", + "add-organizations-label": "Les organisations ajoutées sont affichées ci-dessous :", + "remove-organization-from-board": "Voulez-vous vraiment supprimer cette organisation de ce tableau ?", + "to-create-organizations-contact-admin": "Pour créer des organisations, veuillez contacter l'administrateur.", + "custom-legal-notice-link-url": "URL de la page des mentions légales personnalisées", + "acceptance_of_our_legalNotice": "En continuant, vous acceptez nos", + "legalNotice": "mentions légales", + "copied": "Copié !" } \ No newline at end of file diff --git a/i18n/gl.i18n.json b/i18n/gl.i18n.json index 272baf07c..8a14ddd0c 100644 --- a/i18n/gl.i18n.json +++ b/i18n/gl.i18n.json @@ -96,6 +96,7 @@ "add-members": "Engadir membros", "added": "Added", "addMemberPopup-title": "Membros", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Pode ver e editar tarxetas, retirar membros e cambiar a configuración do taboleiro.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Membros", @@ -268,14 +273,18 @@ "comment-placeholder": "Escribir un comentario", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "Computador", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambiar a data de inicio", "editCardDueDatePopup-title": "Cambiar a data límite", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Cambiar a etiqueta", "editNotificationPopup-title": "Editar a notificación", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar taboleiro", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/gu-IN.i18n.json b/i18n/gu-IN.i18n.json new file mode 100644 index 000000000..6ba6343be --- /dev/null +++ b/i18n/gu-IN.i18n.json @@ -0,0 +1,1129 @@ +{ + "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-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "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.", + "app-try-reconnect": "Try to reconnect.", + "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", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "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>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "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.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "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.", + "close-card": "Close Card", + "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.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "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-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text 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", + "addReactionPopup-title": "Add reaction", + "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", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove 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", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "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", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization 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", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "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", + "card-sorting-by-number": "Card sorting by number", + "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", + "oidc-button-text": "Customize the OIDC button text", + "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.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? 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-creator": "creator", + "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-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "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", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" +} \ No newline at end of file diff --git a/i18n/he.i18n.json b/i18n/he.i18n.json index 8bdb87593..a5abecc29 100644 --- a/i18n/he.i18n.json +++ b/i18n/he.i18n.json @@ -96,6 +96,7 @@ "add-members": "הוספת חברים", "added": "התווסף", "addMemberPopup-title": "חברים", + "memberPopup-title": "הגדרות חברות", "admin": "מנהל", "admin-desc": "יש הרשאות לצפייה ולעריכת כרטיסים, להסרת חברים ולשינוי הגדרות לוח.", "admin-announcement": "הכרזה", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "ו־__count__ כרטיסים נוספים", "apply": "החלה", "app-is-offline": "בטעינה, נא להמתין. רענון הדף תוביל לאבדן מידע. אם הטעינה אורכת זמן רב מדי, מוטב לבדוק אם השרת מקוון.", + "app-try-reconnect": "לנסות להתחבר שוב.", "archive": "העברה לארכיון", "archive-all": "אחסן הכל בארכיון", "archive-board": "העברת הלוח לארכיון", @@ -159,6 +161,8 @@ "card-delete-notice": "מחיקה היא סופית. כל הפעולות המשויכות לכרטיס זה תלכנה לאיבוד.", "card-delete-pop": "כל הפעולות יוסרו מלוח הפעילות ולא תהיה אפשרות לפתוח מחדש את הכרטיס. אין דרך חזרה.", "card-delete-suggest-archive": "על מנת להסיר כרטיסים מהלוח מבלי לאבד את היסטוריית הפעילות שלהם, ניתן לשמור אותם בארכיון.", + "card-archive-pop": "הכרטיס לא יופיע ברשימה הזאת לאחר העברתו לארכיון.", + "card-archive-suggest-cancel": "אפשר בהמשך לשחזר כרטיס מהארכיון.", "card-due": "תאריך יעד", "card-due-on": "תאריך יעד", "card-spent": "זמן שהושקע", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "למחוק פוקר תכנון?", "poker-delete-pop": "מחיקה היא לצמיתות. כל הפעולות המשויכות לפוקר התכנון הזה תאבדנה.", "cardDeletePopup-title": "למחוק כרטיס?", + "cardArchivePopup-title": "להעביר כרטיס לארכיון?", "cardDetailsActionsPopup-title": "פעולות על הכרטיס", "cardLabelsPopup-title": "תוויות", "cardMembersPopup-title": "חברים", @@ -268,14 +273,18 @@ "comment-placeholder": "כתיבת הערה", "comment-only": "הערה בלבד", "comment-only-desc": "ניתן להגיב על כרטיסים בלבד.", + "comment-delete": "למחוק את ההערה?", + "deleteCommentPopup-title": "למחוק הערה?", "no-comments": "אין הערות", "no-comments-desc": "לא ניתן לצפות בתגובות ובפעילויות.", "worker": "עובד/ת", "worker-desc": "אפשר רק להעביר כרטיסים, להקצות כרטיסים לעצמו/ה ולהגיב.", "computer": "מחשב", "confirm-subtask-delete-dialog": "למחוק את תת המשימה?", - "confirm-checklist-delete-dialog": "למחוק את רשימת המשימות?", + "confirm-checklist-delete-popup": "למחוק את רשימת המטלות?", + "checklistDeletePopup-title": "למחוק רשימת מטלות?", "copy-card-link-to-clipboard": "העתקת קישור הכרטיס ללוח הגזירים", + "copy-text-to-clipboard": "העתקת טקסט ללוח הגזירים", "linkCardPopup-title": "קישור כרטיס", "searchElementPopup-title": "חיפוש", "copyCardPopup-title": "העתקת כרטיס", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "שינוי מועד התחלה", "editCardDueDatePopup-title": "שינוי מועד סיום", "editCustomFieldPopup-title": "עריכת שדה", + "addReactionPopup-title": "הוספת סימון כתגובה", "editCardSpentTimePopup-title": "שינוי הזמן שהושקע", "editLabelPopup-title": "שינוי תווית", "editNotificationPopup-title": "שינוי דיווח", @@ -353,7 +363,7 @@ "error-user-notCreated": "משתמש זה לא נוצר", "error-username-taken": "המשתמש כבר קיים במערכת", "error-orgname-taken": "שם הארגון הזה כבר תפוס", - "error-teamname-taken": "שם הקבוצה הזה כבר תפוס", + "error-teamname-taken": "שם הצוות הזה כבר תפוס", "error-email-taken": "כתובת הדוא״ל כבר נמצאת בשימוש", "export-board": "ייצוא לוח", "export-board-json": "ייצוא לוח ל־JSON", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "ייצוא לוח", "exportCardPopup-title": "ייצוא כרטיס", "sort": "מיון", + "sorted": "ממוין", + "remove-sort": "הסרת מיון", "sort-desc": "לחיצה למיון הרשימה", "list-sort-by": "מיון הרשימה לפי:", "list-label-modifiedAt": "מועד הגישה האחרון:", @@ -651,11 +663,14 @@ "automatically-field-on-card": "הוספת שדה לכרטיסים חדשים", "always-field-on-card": "הוספת שדה לכל הכרטיסים", "showLabel-field-on-card": "הצגת תווית של השדה בכרטיס מוקטן", + "showSum-field-on-list": "הצגת סכום השדות בראש הרשימה", "yes": "כן", "no": "לא", "accounts": "חשבונות", "accounts-allowEmailChange": "לאפשר שינוי דוא״ל", "accounts-allowUserNameChange": "לאפשר שינוי שם משתמש", + "tableVisibilityMode-allowPrivateOnly": "הופעה של לוחות: לאפשר לוחות פרטיים בלבד", + "tableVisibilityMode": "הופעה של לוחות", "createdAt": "נוצר ב", "modifiedAt": "נערך ב־", "verified": "עבר אימות", @@ -825,6 +840,7 @@ "error-undefined": "מהו השתבש", "error-ldap-login": "אירעה שגיאה בעת ניסיון הכניסה", "display-authentication-method": "הצגת שיטת אימות", + "oidc-button-text": "עריכת הטקסט על כפתור ה־OIDC", "default-authentication-method": "שיטת אימות כבררת מחדל", "duplicate-board": "שכפול לוח", "org-number": "מספר הארגונים הוא:", @@ -1059,5 +1075,55 @@ "maximize-card": "הגדלת כרטיס", "minimize-card": "מזעור כרטיס", "delete-org-warning-message": "לא ניתן למחוק את הארגון הזה, יש לפחות משתמש אחד ששייך אליו", - "delete-team-warning-message": "לא ניתן למחוק את הצוות הזה, יש לפחות משתמש אחד ששייך אליו" + "delete-team-warning-message": "לא ניתן למחוק את הצוות הזה, יש לפחות משתמש אחד ששייך אליו", + "subject": "נושא", + "details": "פרטים", + "carbon-copy": "עותק (CC:‎)", + "ticket": "כרטיס", + "tickets": "כרטיסים", + "ticket-number": "מספר כרטיס", + "open": "פתו", + "pending": "ממתין", + "closed": "סגור", + "resolved": "פתור", + "cancelled": "בוטל", + "history": "היסטוריה", + "request": "בקשה", + "requests": "בקשות", + "help-request": "בקשת עזרה", + "editCardSortOrderPopup-title": "החלפת אופן סידור", + "cardDetailsPopup-title": "פרטי הכרטיס", + "add-teams": "הוספת צוותים", + "add-teams-label": "הצוותים שנוספו מופיעים להלן:", + "remove-team-from-table": "להסיר את הצוות הזה מהלוח?", + "confirm-btn": "אישור", + "remove-btn": "הסרה", + "filter-card-title-label": "סינון לפי כותרת כרטיס", + "invite-people-success": "ההזמנה להירשם נשלחה בהצלחה", + "invite-people-error": "שגיאה בשליחת ההזמנה להירשם", + "can-invite-if-same-mailDomainName": "שם תחום הדוא״ל", + "to-create-teams-contact-admin": "כדי ליצור צוותים, נא ליצור קשר עם ההנהלה.", + "Node_heap_total_heap_size": "ערימה ב־Node: גודל הערימה הכולל", + "Node_heap_total_heap_size_executable": "ערימה ב־Node: גודל הערימה הכולל להפעלה", + "Node_heap_total_physical_size": "ערימה ב־Node: גודל פיזי כולל", + "Node_heap_total_available_size": "ערימה ב־Node: גודל זמין כולל", + "Node_heap_used_heap_size": "ערימה ב־Node: גודל ערימה בשימוש", + "Node_heap_heap_size_limit": "ערימה ב־Node: מגבלת גודל ערימה", + "Node_heap_malloced_memory": "ערימה ב־Node: זיכרון שהוקצה ב־malloc", + "Node_heap_peak_malloced_memory": "ערימה ב־Node: תקורת זיכרון שהוקצה ב־malloc", + "Node_heap_does_zap_garbage": "ערימה ב־Node: מחסל את האשפה", + "Node_heap_number_of_native_contexts": "ערימה ב־Node: מספר הקשרים טבעיים", + "Node_heap_number_of_detached_contexts": "ערימה ב־Node: מספר הקשרים מנותקים", + "Node_memory_usage_rss": "ניצולת זיכרון של Node: גודל ערכה מאוחסנת", + "Node_memory_usage_heap_total": "ניצולת זיכרון Node: גודל ערימה מוקצית כולל", + "Node_memory_usage_heap_used": "ניצולת זיכרון של Node: זיכרון בשימוש בפועל", + "Node_memory_usage_external": "ניצולת זיכרון של Node: חיצוני", + "add-organizations": "הוספת ארגונים", + "add-organizations-label": "הארגונים שנוספו מוצגים להלן:", + "remove-organization-from-board": "להסיר את הארגון הזה מהלוח הזה?", + "to-create-organizations-contact-admin": "כדי ליצור ארגונים, נא ליצור קשר עם ההנהלה.", + "custom-legal-notice-link-url": "כתובת עמוד הצהרה משפטית משלך", + "acceptance_of_our_legalNotice": "בחירה להמשיך היא למעשה הסכמה ל", + "legalNotice": "הצהרה המשפטית שלנו", + "copied": "הועתק!" } \ No newline at end of file diff --git a/i18n/hi-IN.i18n.json b/i18n/hi-IN.i18n.json new file mode 100644 index 000000000..9004cc623 --- /dev/null +++ b/i18n/hi-IN.i18n.json @@ -0,0 +1,1129 @@ +{ + "accept": "स्वीकार", + "act-activity-notify": "गतिविधि अधिसूचना", + "act-addAttachment": "अनुलग्नक जोड़ा __attachment__ कार्ड के लिए __card__ सूचि मेें __list__ तैराक में __swimlane__ बोर्ड पर __board__", + "act-deleteAttachment": "हटाए गए अनुलग्नक __attachment__ कार्ड पर __card__ सूचि मेें __list__ तैराक में __swimlane__ बोर्ड पर __board__", + "act-addSubtask": "जोड़ा उपकार्य __checklist__ को __card__ सूचि मेें __list__ तैराक में __swimlane__ बोर्ड पर __board__", + "act-addLabel": "जोड़ा गया लेबल __label__ कार्ड के लिए __card__ सूचि मेें __list__ तैराक में __swimlane__ बोर्ड पर __board__", + "act-addedLabel": "जोड़ा गया लेबल __label__ कार्ड के लिए __card__ सूचि मेें __list__ तैराक में __swimlane__ बोर्ड पर __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": "कार्ड पर संपादित टिप्पणी __card__: __comment__ सूची में __list__ स्विमलेन में __swimlane__ बोर्ड पर __board__", + "act-deleteComment": "कार्ड पर हटाई गई टिप्पणी __card__: __comment__ सूची में __list__ स्विमलेन में __swimlane__ बोर्ड पर __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": "बोर्ड पर कस्टम फ़ील्ड __customField__ __board__", + "act-deleteCustomField": "बोर्ड पर कस्टम फ़ील्ड __customField__ हटा दिया गया __board__", + "act-setCustomField": "कस्टम फ़ील्ड __customField__ संपादित करें: __customFieldValue__ कार्ड पर __card__ सूची में __list__ स्विमलेन __swimlane__ पर बोर्ड __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": "कार्रवाई", + "activities": "गतिविधियां", + "activity": "क्रियाएँ", + "activity-added": "जोड़ा गया %s से %s", + "activity-archived": "%sसंग्रह में ले जाया गया", + "activity-attached": "संलग्न %s से %s", + "activity-created": "बनाया %s", + "activity-customfield-created": "बनाया रिवाज क्षेत्र %s", + "activity-excluded": "छोड़ा %s से %s", + "activity-imported": "सूचित कर %s के अंदर %s से %s", + "activity-imported-board": "सूचित कर %s से %s", + "activity-joined": "शामिल %s", + "activity-moved": "स्थानांतरित %s से %s तक %s", + "activity-on": "पर %s", + "activity-removed": "हटा दिया %s से %s", + "activity-sent": "प्रेषित %s तक %s", + "activity-unjoined": "शामिल नहीं %s", + "activity-subtask-added": "जोड़ा उप कार्य तक %s", + "activity-checked-item": "चिह्नित %s अंदर में चिह्नांकन-सूची %s of %s", + "activity-unchecked-item": "अचिह्नित %s अंदर में चिह्नांकन-सूची %s of %s", + "activity-checklist-added": "संकलित चिह्नांकन-सूची तक %s", + "activity-checklist-removed": "हटा दिया एक चिह्नांकन-सूची से %s", + "activity-checklist-completed": "पूरी जाँच सूची%sकी %s", + "activity-checklist-uncompleted": "अपूर्ण चिह्नांकन-सूची %s of %s", + "activity-checklist-item-added": "संकलित चिह्नांकन-सूची विषय तक '%s' अंदर में %s", + "activity-checklist-item-removed": "हटा दिया एक चिह्नांकन-सूची विषय से '%s' अंदर में %s", + "add": "जोड़ें", + "activity-checked-item-card": "चिह्नित %s अंदर में चिह्नांकन-सूची %s", + "activity-unchecked-item-card": "अचिह्नित %s अंदर में चिह्नांकन-सूची %s", + "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "activity-checklist-uncompleted-card": "अपूर्ण चिह्नांकन-सूची %s", + "activity-editComment": "संपादित टिप्पणी", + "activity-deleteComment": "टिप्पणी हटा दी गई", + "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-board": "बोर्ड जोड़ें", + "add-template": "Add Template", + "add-card": "कार्ड जोड़ें", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "तैरन जोड़ें", + "add-subtask": "उप कार्य जोड़ें", + "add-checklist": "चिह्नांकन-सूची जोड़ें", + "add-checklist-item": "चिह्नांकन-सूची विषय कोई तक जोड़ें", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "आवरण जोड़ें", + "add-label": "नामपत्र जोड़ें", + "add-list": "सूची जोड़ें", + "add-members": "सदस्य जोड़ें", + "added": "जोड़ा गया", + "addMemberPopup-title": "सदस्य", + "memberPopup-title": "सदस्य व्यवस्था", + "admin": "Admin", + "admin-desc": "कार्ड देख और संपादित कर सकते हैं, सदस्यों को हटा सकते हैं, और बोर्ड के लिए सेटिंग्स बदल सकते हैं।", + "admin-announcement": "घोषणा", + "admin-announcement-active": "सक्रिय सिस्टम-व्यापी घोषणा", + "admin-announcement-title": "घोषणा प्रशासक से", + "all-boards": "सभी बोर्ड", + "and-n-other-card": "और __count__ other कार्ड", + "and-n-other-card_plural": "और __count__ other कार्ड", + "apply": "Apply", + "app-is-offline": "लोड हो रहा है, कृपया प्रतीक्षा करें । पृष्ठ को ताज़ा करना डेटा की हानि का कारण होगा । यदि लोड करना कार्य नहीं करता है, तो कृपया जांचें कि सर्वर बंद नहीं हुआ है ।", + "app-try-reconnect": "Try to reconnect.", + "archive": "संग्रह में ले जाएं", + "archive-all": "सभी को संग्रह में ले जाएं", + "archive-board": "संग्रह करने के लिए बोर्ड ले जाएँ", + "archive-card": "कार्ड को संग्रह में ले जाएं", + "archive-list": "सूची को संग्रह में ले जाएं", + "archive-swimlane": "संग्रह करने के लिए स्विमलेन ले जाएँ", + "archive-selection": "चयन को संग्रह में ले जाएं", + "archiveBoardPopup-title": "बोर्ड को संग्रह में स्थानांतरित करें?", + "archived-items": "संग्रह", + "archived-boards": "संग्रह में बोर्ड", + "restore-board": "पुनर्स्थापना बोर्ड", + "no-archived-boards": "संग्रह में कोई बोर्ड नहीं ।", + "archives": "पुरालेख", + "template": "खाका", + "templates": "खाका", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "assign-member": "आवंटित सदस्य", + "attached": "संलग्न", + "attachment": "संलग्नक", + "attachment-delete-pop": "किसी संलग्नक को हटाना स्थाई है । कोई पूर्ववत् नहीं है ।", + "attachmentDeletePopup-title": "मिटाएँ संलग्नक?", + "attachments": "संलग्नक", + "auto-watch": "स्वचालित रूप से देखो बोर्डों जब वे बनाए जाते हैं", + "avatar-too-big": "अवतार बहुत बड़ा है (अधिकतम 520KB)", + "back": "वापस", + "board-change-color": "रंग बदलना", + "board-nb-stars": "%s पसंद होना", + "board-not-found": "बोर्ड नहीं मिला", + "board-private-info": "यह बोर्ड हो जाएगा <strong>निजी</strong>.", + "board-public-info": "यह बोर्ड हो जाएगा <strong>सार्वजनिक</strong>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "boardChangeColorPopup-title": "बोर्ड पृष्ठभूमि बदलें", + "boardChangeTitlePopup-title": "बोर्ड का नाम बदलें", + "boardChangeVisibilityPopup-title": "दृश्यता बदलें", + "boardChangeWatchPopup-title": "बदलें वॉच", + "boardMenuPopup-title": "बोर्ड सेटिंग्स", + "boardChangeViewPopup-title": "बोर्ड दृष्टिकोण", + "boards": "बोर्डों", + "board-view": "बोर्ड दृष्टिकोण", + "board-view-cal": "तिथि-पत्र", + "board-view-swimlanes": "तैरना", + "board-view-collapse": "संक्षिप्त करें", + "board-view-gantt": "Gantt", + "board-view-lists": "सूचियाँ", + "bucket-example": "उदाहरण के लिए “बाल्टी सूची” की तरह", + "cancel": "रद्द करें", + "card-archived": "यह कार्ड संग्रह करने के लिए ले जाया गया है ।", + "board-archived": "यह बोर्ड संग्रह करने के लिए ले जाया जाता है ।", + "card-comments-title": "इस कार्ड में %s टिप्पणी है।", + "card-delete-notice": "हटाना स्थायी है। आप इस कार्ड से जुड़े सभी कार्यों को खो देंगे।", + "card-delete-pop": "सभी कार्रवाइयां गतिविधि फ़ीड से निकाल दी जाएंगी और आप कार्ड को फिर से खोलने में सक्षम नहीं होंगे । कोई पूर्ववत् नहीं है ।", + "card-delete-suggest-archive": "आप एक कार्ड को बोर्ड से हटाने और गतिविधि को संरक्षित करने के लिए संग्रह में ले जा सकते हैं ।", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "card-due": "नियत", + "card-due-on": "पर नियत", + "card-spent": "समय बिताया", + "card-edit-attachments": "संपादित संलग्नक", + "card-edit-custom-fields": "संपादित प्रचलन क्षेत्र", + "card-edit-labels": "संपादित नामपत्र", + "card-edit-members": "संपादित सदस्य", + "card-labels-title": "कार्ड के लिए नामपत्र परिवर्तित करें ।", + "card-members-title": "कार्ड से बोर्ड के सदस्यों को जोड़ें या हटाएं।", + "card-start": "प्रारंभ", + "card-start-on": "पर शुरू होता है", + "cardAttachmentsPopup-title": "से अनुलग्न करें", + "cardCustomField-datePopup-title": "तारीख बदलें", + "cardCustomFieldsPopup-title": "संपादित करें प्रचलन क्षेत्र", + "cardStartVotingPopup-title": "वोट शुरू करें", + "positiveVoteMembersPopup-title": "समर्थकों का", + "negativeVoteMembersPopup-title": "प्रतिद्वंद्वी", + "card-edit-voting": "मतदान संपादित करें", + "editVoteEndDatePopup-title": "मतदान समाप्ति की तारीख बदलें", + "allowNonBoardMembers": "सभी लॉग इन उपयोगकर्ताओं को अनुमति दें", + "vote-question": "मतदान का सवाल", + "vote-public": "दिखाएँ कि किसने क्या मतदान किया", + "vote-for-it": "इसके लिए", + "vote-against": "के प्रतिकूल", + "deleteVotePopup-title": "मतदान हटाएं?", + "vote-delete-pop": "हटाना स्थायी है। आप इस मतदान से जुड़े सभी कार्यों को खो देंगे।", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "मिटाएँ कार्ड?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "कार्ड क्रियाएँ", + "cardLabelsPopup-title": "नामपत्र", + "cardMembersPopup-title": "सदस्य", + "cardMorePopup-title": "अतिरिक्त", + "cardTemplatePopup-title": "खाका बनाएं", + "cards": "कार्ड्स", + "cards-count": "कार्ड्स", + "cards-count-one": "कार्ड", + "casSignIn": "सीएएस के साथ साइन इन करें", + "cardType-card": "कार्ड", + "cardType-linkedCard": "जुड़े हुए कार्ड", + "cardType-linkedBoard": "जुड़े हुए बोर्ड", + "change": "तब्दीली", + "change-avatar": "अवतार परिवर्तन करें", + "change-password": "गोपनीयता परिवर्तन करें", + "change-permissions": "अनुमतियां परिवर्तित करें", + "change-settings": "व्यवस्था परिवर्तित करें", + "changeAvatarPopup-title": "अवतार परिवर्तन करें", + "changeLanguagePopup-title": "भाषा परिवर्तन करें", + "changePasswordPopup-title": "गोपनीयता परिवर्तन करें", + "changePermissionsPopup-title": "अनुमतियां परिवर्तित करें", + "changeSettingsPopup-title": "व्यवस्था परिवर्तित करें", + "subtasks": "उप-कार्य", + "checklists": "जांच सूची", + "click-to-star": "इस बोर्ड को स्टार करने के लिए क्लिक करें ।", + "click-to-unstar": "इस बोर्ड को अनस्टार करने के लिए क्लिक करें।", + "clipboard": "क्लिपबोर्ड या खींचें और छोड़ें", + "close": "बंद करे", + "close-board": "बोर्ड बंद करे", + "close-board-pop": "आप होम हेडर से \"संग्रह\" बटन पर क्लिक करके बोर्ड को पुनर्स्थापित करने में सक्षम होंगे।", + "close-card": "Close Card", + "color-black": "काला", + "color-blue": "नीला", + "color-crimson": "गहरा लाल", + "color-darkgreen": "गहरा हरा", + "color-gold": "स्वर्ण", + "color-gray": "भूरे", + "color-green": "हरा", + "color-indigo": "नील", + "color-lime": "हल्का हरा", + "color-magenta": "मैजंटा", + "color-mistyrose": "हल्का गुलाबी", + "color-navy": "navy", + "color-orange": "नारंगी", + "color-paleturquoise": "paleturquoise", + "color-peachpuff": "peachpuff", + "color-pink": "गुलाबी", + "color-plum": "plum", + "color-purple": "बैंगनी", + "color-red": "लाल", + "color-saddlebrown": "saddlebrown", + "color-silver": "silver", + "color-sky": "आकाशिया नीला", + "color-slateblue": "slateblue", + "color-white": "white", + "color-yellow": "पीला", + "unset-color": "Unset", + "comment": "टिप्पणी", + "comment-placeholder": "टिप्पणी लिखें", + "comment-only": "केवल टिप्पणी करें", + "comment-only-desc": "केवल कार्ड पर टिप्पणी कर सकते हैं।", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "no-comments": "कोई टिप्पणी नहीं", + "no-comments-desc": "टिप्पणियां और गतिविधियां नहीं देख पा रहे हैं।", + "worker": "कामगार", + "worker-desc": "केवल कार्ड ले जा सकते हैं, खुद को कार्ड और टिप्पणी करने के लिए असाइन करें।", + "computer": "संगणक", + "confirm-subtask-delete-dialog": "क्या आप वाकई उपकार्य हटाना चाहते हैं?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "कॉपी कार्ड क्लिपबोर्ड करने के लिए लिंक", + "copy-text-to-clipboard": "Copy text to clipboard", + "linkCardPopup-title": "कार्ड कड़ी", + "searchElementPopup-title": "Search", + "copyCardPopup-title": "कार्ड प्रतिलिपि", + "copyChecklistToManyCardsPopup-title": "कई कार्ड के लिए जांचसूची खाके की प्रतिलिपि बनाएँ", + "copyChecklistToManyCardsPopup-instructions": "इस JSON प्रारूप में गंतव्य कार्ड शीर्षक और विवरण", + "copyChecklistToManyCardsPopup-format": "[{\"title\":\"पहला कार्ड शीर्षक\",\"description\":\"पहला कार्ड विवरण\"},{\"title\":\"दूसरा कार्ड शीर्षक\",\"description\":\"दूसरा कार्ड विवरण\"},{\"title\":\"अंतिम कार्ड शीर्षक\",\"description\":\"अंतिम कार्ड विवरण\" }]", + "create": "निर्माण करना", + "createBoardPopup-title": "बोर्ड निर्माण करना", + "chooseBoardSourcePopup-title": "बोर्ड आयात", + "createLabelPopup-title": "नामपत्र निर्माण", + "createCustomField": "क्षेत्र निर्माण करना", + "createCustomFieldPopup-title": "क्षेत्र निर्माण", + "current": "वर्तमान", + "custom-field-delete-pop": "कोई पूर्ववत् नहीं है । यह सभी कार्ड से इस कस्टम क्षेत्र को हटा दें और इसके इतिहास को नष्ट कर देगा ।", + "custom-field-checkbox": "निशानबक्से", + "custom-field-currency": "मुद्रा", + "custom-field-currency-option": "मुद्रा संहिता", + "custom-field-date": "दिनांक", + "custom-field-dropdown": "ड्रॉपडाउन सूची", + "custom-field-dropdown-none": "(कोई नहीं)", + "custom-field-dropdown-options": "सूची विकल्प", + "custom-field-dropdown-options-placeholder": "Press enter तक जोड़ें more options", + "custom-field-dropdown-unknown": "(unknown)", + "custom-field-number": "Number", + "custom-field-text": "Text", + "custom-fields": "प्रचलन क्षेत्र", + "date": "Date", + "decline": "Decline", + "default-avatar": "Default avatar", + "delete": "Delete", + "deleteCustomFieldPopup-title": "मिटाएँ प्रचलन क्षेत्र?", + "deleteLabelPopup-title": "मिटाएँ Label?", + "description": "Description", + "disambiguateMultiLabelPopup-title": "Disambiguate Label Action", + "disambiguateMultiMemberPopup-title": "Disambiguate सदस्य Action", + "discard": "Disकार्ड", + "done": "Done", + "download": "Download", + "edit": "Edit", + "edit-avatar": "Change Avatar", + "edit-profile": "संपादित करें Profile", + "edit-wip-limit": "संपादित करें WIP Limit", + "soft-wip-limit": "Soft WIP Limit", + "editCardStartDatePopup-title": "Change start date", + "editCardDueDatePopup-title": "Change due date", + "editCustomFieldPopup-title": "संपादित करें Field", + "addReactionPopup-title": "Add reaction", + "editCardSpentTimePopup-title": "Change spent time", + "editLabelPopup-title": "Change Label", + "editNotificationPopup-title": "संपादित करें Notification", + "editProfilePopup-title": "संपादित करें 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 तक send email", + "email-invalid": "Invalid email", + "email-invite": "Invite via Email", + "email-invite-subject": "__inviter__ प्रेषित you an invitation", + "email-invite-text": "Dear __user__,\n\n__inviter__ invites you तक join बोर्ड \"__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": "नमस्ते __user __, \n\n अपना खाता ईमेल सत्यापित करने के लिए, बस नीचे दिए गए लिंक पर क्लिक करें। \n\n__url __ \n\n धन्यवाद।", + "enable-wip-limit": "Enable WIP Limit", + "error-board-doesNotExist": "यह बोर्ड does not exist", + "error-board-notAdmin": "You need तक be व्यवस्थापक of यह बोर्ड तक do that", + "error-board-notAMember": "You need तक be एक सदस्य of यह बोर्ड तक do that", + "error-json-malformed": "Your text is not valid JSON", + "error-json-schema": "आपके JSON डेटा में सही प्रारूप में सही जानकारी शामिल नहीं है", + "error-csv-schema": "आपके CSV (कोमा सेपरेटेड वैल्यूज़) / TSV (टैब सेपरेटेड वैल्यूज़) में सही फॉर्मेट में उचित जानकारी शामिल नहीं है", + "error-list-doesNotExist": "यह सूची does not exist", + "error-user-doesNotExist": "यह user does not exist", + "error-user-notAllowSelf": "You can not invite yourself", + "error-user-notCreated": "यह user is not created", + "error-username-taken": "यह 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 बोर्ड", + "export-board-json": "JSON को निर्यात बोर्ड", + "export-board-csv": "निर्यात बोर्ड को सी.एस.वी.", + "export-board-tsv": "टी.एस.वी. को निर्यात बोर्ड", + "export-board-excel": "Export board to Excel", + "user-can-not-export-excel": "User can not export Excel", + "export-board-html": "HTML को निर्यात बोर्ड", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export बोर्ड", + "exportCardPopup-title": "Export card", + "sort": "भांति", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "क्रमबद्ध सूची पर क्लिक करें", + "list-sort-by": "सूची क्रमबद्ध करें:", + "list-label-modifiedAt": "अंतिम पहुंच समय", + "list-label-title": "सूची का नाम", + "list-label-sort": "आपका नियमावलीआदेश", + "list-label-short-modifiedAt": "(बड़ा)", + "list-label-short-title": "(साधारण)", + "list-label-short-sort": "(मध्यम)", + "filter": "Filter", + "filter-cards": "निस्पंदन पत्ते या सूची", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "शीर्षक द्वारा निस्पंदन सूची", + "filter-clear": "Clear filter", + "filter-labels-label": "लेबल द्वारा फ़िल्टर करें", + "filter-no-label": "No label", + "filter-member-label": "सदस्य द्वारा फ़िल्टर करें", + "filter-no-member": "No सदस्य", + "filter-assignee-label": "संपत्ति-भागी द्वारा फ़िल्टर करें", + "filter-no-assignee": "कोई अभिहस्तांकिती नहीं", + "filter-custom-fields-label": "Filter by Custom Fields", + "filter-no-custom-fields": "No प्रचलन क्षेत्र", + "filter-show-archive": "संग्रहित सूची दिखाएं", + "filter-hide-empty": "खाली सूची छिपाएं", + "filter-on": "Filter is on", + "filter-on-desc": "You are filtering कार्ड इस पर बोर्ड. Click here तक संपादित करें filter.", + "filter-to-selection": "Filter तक selection", + "other-filters-label": "अन्य फिल्टर", + "advanced-filter-label": "Advanced Filter", + "advanced-filter-description": "Advanced Filter allows तक write एक string containing following operators: == != <= >= && || ( ) एक space is used as एक separator between the Operators. You can filter for संपूर्ण प्रचलन क्षेत्र by typing their names और values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need तक encapsulate them के अंदर single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) तक be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally संपूर्ण operators are interpreted से left तक 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 तक your बोर्डों page.", + "hide-system-messages": "Hide system messages", + "headerBarCreateBoardPopup-title": "Create बोर्ड", + "home": "Home", + "import": "Import", + "impersonate-user": "Impersonate user", + "link": "Link", + "import-board": "import बोर्ड", + "import-board-c": "Import बोर्ड", + "import-board-title-trello": "Import बोर्ड से Trello", + "import-board-title-wekan": "Import board from previous export", + "import-board-title-csv": "CSV / TSV से आयात बोर्ड", + "from-trello": "From Trello", + "from-wekan": "From previous export", + "from-csv": "CSV / TSV से", + "import-board-instruction-trello": "In your Trello बोर्ड, go तक 'Menu', then 'More', 'Print और Export', 'Export JSON', और copy the resulting text.", + "import-board-instruction-csv": "अपने कोमा सेपरेटेड वैल्यू (CSV) / ​​टैब सेपरेटेड वैल्यू (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": "अपना वैध CSV / TSV सामग्री यहां पेस्ट करें", + "import-map-members": "Map सदस्य", + "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": "Re आलोकन सदस्य 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 तक यह बोर्ड", + "keyboard-shortcuts": "Keyबोर्ड shortcuts", + "label-create": "Create Label", + "label-default": "%s label (default)", + "label-delete-pop": "There is no undo. यह will हटा यह label से संपूर्ण कार्ड और destroy its history.", + "labels": "नामपत्र", + "language": "Language", + "last-admin-desc": "You can’t change roles because there must be at least one admin.", + "leave-board": "Leave बोर्ड", + "leave-board-pop": "Are you sure you want तक leave __boardTitle__? You हो जाएगा हटा दिया से संपूर्ण कार्ड इस पर बोर्ड.", + "leaveBoardPopup-title": "Leave बोर्ड ?", + "link-card": "Link तक यह कार्ड", + "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": "स्थानांतरित संपूर्ण कार्ड अंदर में यह list", + "list-select-cards": "Select संपूर्ण कार्ड अंदर में यह list", + "set-color-list": "Set Color", + "listActionPopup-title": "सूची Actions", + "settingsUserPopup-title": "उपयोगकर्ता सेटिंग", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization Settings", + "swimlaneActionPopup-title": "तैरन Actions", + "swimlaneAddPopup-title": "Add a Swimlane below", + "listImportCardPopup-title": "Import एक Trello कार्ड", + "listImportCardsTsvPopup-title": "एक्सेल CSV / TSV आयात करें", + "listMorePopup-title": "More", + "link-list": "Link तक यह list", + "list-delete-pop": "All actions हो जाएगा हटा दिया से the activity feed और you won't be able तक 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": "तैरन", + "log-out": "Log Out", + "log-in": "Log In", + "loginPopup-title": "Log In", + "memberMenuPopup-title": "सदस्य व्यवस्था", + "members": "सदस्य", + "menu": "Menu", + "move-selection": "स्थानांतरित selection", + "moveCardPopup-title": "स्थानांतरित कार्ड", + "moveCardToBottom-title": "स्थानांतरित तक Bottom", + "moveCardToTop-title": "स्थानांतरित तक Top", + "moveSelectionPopup-title": "स्थानांतरित 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": "आप किसी भी परिवर्तन के अधिसूचित नहीं किया जाएगा अंदर में यह बोर्ड", + "my-boards": "My बोर्ड", + "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 आलोकन और संपादित करें कार्ड. Can't change व्यवस्था.", + "not-accepted-yet": "Invitation not accepted yet", + "notify-participate": "Receive updates तक any कार्ड you participate as creater or सदस्य", + "notify-watch": "Receive updates तक any बोर्ड, lists, or कार्ड you’re watching", + "optional": "optional", + "or": "or", + "page-maybe-private": "यह page may be private. You may be able तक आलोकन it by <a href='%s'>logging in</a>.", + "page-not-found": "Page नहीं मिला.", + "password": "Password", + "paste-or-dragdrop": "to paste, or drag & drop image file तक it (image only)", + "participating": "Participating", + "preview": "Preview", + "previewAttachedImagePopup-title": "Preview", + "previewClipboardImagePopup-title": "Preview", + "private": "Private", + "private-desc": "यह बोर्ड is private. Only people संकलित तक the बोर्ड can आलोकन और संपादित करें it.", + "profile": "Profile", + "public": "Public", + "public-desc": "यह बोर्ड is public. It's visible तक anyone साथ में the link और will show up अंदर में गूगल की तरह खोज इंजन । केवल लोग संकलित तक बोर्ड संपादित कर सकते हैं.", + "quick-access-description": "Star एक बोर्ड तक जोड़ें एक shortcut अंदर में यह पट्टी .", + "remove-cover": "हटाएँ Cover", + "remove-from-board": "हटाएँ से बोर्ड", + "remove-label": "हटाएँ Label", + "listDeletePopup-title": "मिटाएँ सूची ?", + "remove-member": "हटाएँ सदस्य", + "remove-member-from-card": "हटाएँ से कार्ड", + "remove-member-pop": "हटाएँ __name__ (__username__) से __boardTitle__? इस बोर्ड पर सभी कार्ड से सदस्य हटा दिया जाएगा। उन्हें एक अधिसूचना प्राप्त होगी।", + "removeMemberPopup-title": "हटाएँ सदस्य?", + "rename": "Rename", + "rename-board": "Rename बोर्ड", + "restore": "Restore", + "save": "Save", + "search": "Search", + "rules": "Rules", + "search-cards": "इस बोर्ड पर कार्ड / सूची शीर्षक, विवरण और आदत क्षेत्र से खोजें", + "search-example": "Write text you search and press Enter", + "select-color": "Select Color", + "select-board": "Select Board", + "set-wip-limit-value": "Set एक limit for the maximum number of tasks अंदर में यह list", + "setWipLimitPopup-title": "Set WIP Limit", + "shortcut-assign-self": "Assign yourself तक current कार्ड", + "shortcut-autocomplete-emoji": "Autocomplete emoji", + "shortcut-autocomplete-members": "Autocomplete सदस्य", + "shortcut-clear-filters": "Clear संपूर्ण filters", + "shortcut-close-dialog": "Close Dialog", + "shortcut-filter-my-cards": "Filter my कार्ड", + "shortcut-show-shortcuts": "Bring up यह shortcuts list", + "shortcut-toggle-filterbar": "Toggle Filter Sidebar", + "shortcut-toggle-searchbar": "Toggle Search Sidebar", + "shortcut-toggle-sidebar": "Toggle बोर्ड Sidebar", + "show-cards-minimum-count": "Show कार्ड count if सूची contains more than", + "sidebar-open": "Open Sidebar", + "sidebar-close": "Close Sidebar", + "signupPopup-title": "Create an Account", + "star-board-title": "Click तक star यह बोर्ड. It will show up at top of your बोर्डों list.", + "starred-boards": "Starred बोर्ड", + "starred-boards-description": "Starred बोर्डों show up at the top of your बोर्डों list.", + "subscribe": "Subscribe", + "team": "Team", + "this-board": "यह बोर्ड", + "this-card": "यह कार्ड", + "spent-time-hours": "Spent time (hours)", + "overtime-hours": "Overtime (hours)", + "overtime": "Overtime", + "has-overtime-cards": "Has overtime कार्ड", + "has-spenttime-cards": "Has spent time कार्ड", + "time": "Time", + "title": "Title", + "tracking": "Tracking", + "tracking-info": "You हो जाएगा notified of any changes तक those कार्ड you are involved as creator or सदस्य.", + "type": "Type", + "unassign-member": "Unassign सदस्य", + "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": "आलोकन it", + "warn-list-archived": "warning: this card is in an list at Archive", + "watch": "Watch", + "watching": "Watching", + "watching-info": "You हो जाएगा notified of any change अंदर में यह बोर्ड", + "welcome-board": "Welcome बोर्ड", + "welcome-swimlane": "Milestone 1", + "welcome-list1": "Basics", + "welcome-list2": "Advanced", + "card-templates-swimlane": "कार्ड का खाका", + "list-templates-swimlane": "सूची का खाका", + "board-templates-swimlane": "बोर्ड का खाका", + "what-to-do": "What do you want तक do?", + "wipLimitErrorPopup-title": "Invalid WIP Limit", + "wipLimitErrorPopup-dialog-pt1": "The number of tasks अंदर में यह सूची is higher than the WIP limit you've defined.", + "wipLimitErrorPopup-dialog-pt2": "Please स्थानांतरित some tasks out of यह list, or set एक higher WIP limit.", + "admin-panel": "व्यवस्थापक Panel", + "settings": "Settings", + "people": "People", + "registration": "Registration", + "disable-self-registration": "Disable Self-Registration", + "invite": "Invite", + "invite-people": "Invite People", + "to-boards": "To बोर्ड(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 एक test email तक yourself", + "invitation-code": "Invitation Code", + "email-invite-register-subject": "__inviter__ प्रेषित 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 प्रेषित an email", + "error-invitation-code-not-exist": "Invitation code doesn't exist", + "error-notAuthorized": "You are not authorized तक आलोकन यह page.", + "webhook-title": "वेबहुक नाम", + "webhook-token": "टोकन (प्रमाणीकरण के लिए वैकल्पिक)", + "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 यह field on कार्ड", + "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", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "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", + "card-sorting-by-number": "Card sorting by number", + "board-delete-notice": "Deleting is permanent. You will lose संपूर्ण lists, कार्ड और actions associated साथ में यह बोर्ड.", + "delete-board-confirm-popup": "All lists, कार्ड,नामपत्र , और activities हो जाएगा deleted और you won't be able तक recover the बोर्ड contents. There is no undo.", + "boardDeletePopup-title": "मिटाएँ बोर्ड?", + "delete-board": "मिटाएँ बोर्ड", + "default-subtasks-board": "Subtasks for __board__ बोर्ड", + "default": "Default", + "queue": "Queue", + "subtask-settings": "Subtasks व्यवस्था", + "card-settings": "Card Settings", + "boardSubtaskSettingsPopup-title": "बोर्ड Subtasks व्यवस्था", + "boardCardSettingsPopup-title": "Card Settings", + "deposit-subtasks-board": "Deposit subtasks तक यह बोर्ड:", + "deposit-subtasks-list": "Landing सूची for subtasks deposited here:", + "show-parent-in-minicard": "Show parent अंदर में minicard:", + "prefix-with-full-path": "Prefix साथ में full path", + "prefix-with-parent": "Prefix साथ में parent", + "subtext-with-full-path": "Subtext साथ में full path", + "subtext-with-parent": "Subtext साथ में parent", + "change-card-parent": "Change कार्ड's parent", + "parent-card": "Parent कार्ड", + "source-board": "Source बोर्ड", + "no-parent": "Don't show parent", + "activity-added-label": "संकलित label '%s' तक %s", + "activity-removed-label": "हटा दिया label '%s' से %s", + "activity-delete-attach": "deleted an संलग्नक से %s", + "activity-added-label-card": "संकलित label '%s'", + "activity-removed-label-card": "हटा दिया label '%s'", + "activity-delete-attach-card": "deleted an संलग्नक", + "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": "जोड़ें trigger", + "r-add-action": "जोड़ें action", + "r-board-rules": "बोर्ड rules", + "r-add-rule": "जोड़ें rule", + "r-view-rule": "आलोकन rule", + "r-delete-rule": "मिटाएँ 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": "हटा दिया from", + "r-the-board": "the बोर्ड", + "r-list": "list", + "list": "List", + "set-filter": "Set Filter", + "r-moved-to": "स्थानांतरित to", + "r-moved-from": "स्थानांतरित from", + "r-archived": "Moved to Archive", + "r-unarchived": "Restored from Archive", + "r-a-card": "a कार्ड", + "r-when-a-label-is": "जब एक नामपत्र है", + "r-when-the-label": "जब नामपत्र है", + "r-list-name": "list name", + "r-when-a-member": "जब एक सदस्य is", + "r-when-the-member": "जब the सदस्य", + "r-name": "name", + "r-when-a-attach": "जब an संलग्नक", + "r-when-a-checklist": "जब एक चिह्नांकन-सूची is", + "r-when-the-checklist": "जब the checklist", + "r-completed": "Completed", + "r-made-incomplete": "Made incomplete", + "r-when-a-item": "जब एक चिह्नांकन-सूची विषय is", + "r-when-the-item": "जब the चिह्नांकन-सूची item", + "r-checked": "Checked", + "r-unchecked": "Unchecked", + "r-move-card-to": "स्थानांतरित कार्ड to", + "r-top-of": "Top of", + "r-bottom-of": "Bottom of", + "r-its-list": "its list", + "r-archive": "संग्रह में ले जाएं", + "r-unarchive": "Restore from Archive", + "r-card": "कार्ड", + "r-add": "जोड़ें", + "r-remove": "Remove", + "r-label": "label", + "r-member": "member", + "r-remove-all": "हटाएँ संपूर्ण सदस्य से the कार्ड", + "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": "स्थानांतरित कार्ड तक top of its list", + "r-d-move-to-top-spec": "स्थानांतरित कार्ड तक top of list", + "r-d-move-to-bottom-gen": "स्थानांतरित कार्ड तक bottom of its list", + "r-d-move-to-bottom-spec": "स्थानांतरित कार्ड तक 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": "जोड़ें label", + "r-d-remove-label": "हटाएँ label", + "r-create-card": "Create new card", + "r-in-list": "in list", + "r-in-swimlane": "in swimlane", + "r-d-add-member": "जोड़ें सदस्य", + "r-d-remove-member": "हटाएँ सदस्य", + "r-d-remove-all-member": "हटाएँ संपूर्ण सदस्य", + "r-d-check-all": "Check संपूर्ण items of एक list", + "r-d-uncheck-all": "Uncheck संपूर्ण items of एक list", + "r-d-check-one": "Check item", + "r-d-uncheck-one": "Uncheck item", + "r-d-check-of-list": "of checklist", + "r-d-add-checklist": "जोड़ें checklist", + "r-d-remove-checklist": "हटाएँ checklist", + "r-by": "by", + "r-add-checklist": "जोड़ें 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": "जब एक कार्ड is स्थानांतरित तक 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", + "oidc-button-text": "Customize the OIDC button text", + "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.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? 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": "कार्ड", + "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-creator": "creator", + "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-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "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", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" +} \ No newline at end of file diff --git a/i18n/hi.i18n.json b/i18n/hi.i18n.json index 4a775d615..9004cc623 100644 --- a/i18n/hi.i18n.json +++ b/i18n/hi.i18n.json @@ -96,6 +96,7 @@ "add-members": "सदस्य जोड़ें", "added": "जोड़ा गया", "addMemberPopup-title": "सदस्य", + "memberPopup-title": "सदस्य व्यवस्था", "admin": "Admin", "admin-desc": "कार्ड देख और संपादित कर सकते हैं, सदस्यों को हटा सकते हैं, और बोर्ड के लिए सेटिंग्स बदल सकते हैं।", "admin-announcement": "घोषणा", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "और __count__ other कार्ड", "apply": "Apply", "app-is-offline": "लोड हो रहा है, कृपया प्रतीक्षा करें । पृष्ठ को ताज़ा करना डेटा की हानि का कारण होगा । यदि लोड करना कार्य नहीं करता है, तो कृपया जांचें कि सर्वर बंद नहीं हुआ है ।", + "app-try-reconnect": "Try to reconnect.", "archive": "संग्रह में ले जाएं", "archive-all": "सभी को संग्रह में ले जाएं", "archive-board": "संग्रह करने के लिए बोर्ड ले जाएँ", @@ -159,6 +161,8 @@ "card-delete-notice": "हटाना स्थायी है। आप इस कार्ड से जुड़े सभी कार्यों को खो देंगे।", "card-delete-pop": "सभी कार्रवाइयां गतिविधि फ़ीड से निकाल दी जाएंगी और आप कार्ड को फिर से खोलने में सक्षम नहीं होंगे । कोई पूर्ववत् नहीं है ।", "card-delete-suggest-archive": "आप एक कार्ड को बोर्ड से हटाने और गतिविधि को संरक्षित करने के लिए संग्रह में ले जा सकते हैं ।", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "नियत", "card-due-on": "पर नियत", "card-spent": "समय बिताया", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "मिटाएँ कार्ड?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "कार्ड क्रियाएँ", "cardLabelsPopup-title": "नामपत्र", "cardMembersPopup-title": "सदस्य", @@ -268,14 +273,18 @@ "comment-placeholder": "टिप्पणी लिखें", "comment-only": "केवल टिप्पणी करें", "comment-only-desc": "केवल कार्ड पर टिप्पणी कर सकते हैं।", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "कोई टिप्पणी नहीं", "no-comments-desc": "टिप्पणियां और गतिविधियां नहीं देख पा रहे हैं।", "worker": "कामगार", "worker-desc": "केवल कार्ड ले जा सकते हैं, खुद को कार्ड और टिप्पणी करने के लिए असाइन करें।", "computer": "संगणक", "confirm-subtask-delete-dialog": "क्या आप वाकई उपकार्य हटाना चाहते हैं?", - "confirm-checklist-delete-dialog": "क्या आप वाकई जांचसूची हटाना चाहते हैं?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "कॉपी कार्ड क्लिपबोर्ड करने के लिए लिंक", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "कार्ड कड़ी", "searchElementPopup-title": "Search", "copyCardPopup-title": "कार्ड प्रतिलिपि", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "संपादित करें Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "संपादित करें Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export बोर्ड", "exportCardPopup-title": "Export card", "sort": "भांति", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "क्रमबद्ध सूची पर क्लिक करें", "list-sort-by": "सूची क्रमबद्ध करें:", "list-label-modifiedAt": "अंतिम पहुंच समय", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/hr.i18n.json b/i18n/hr.i18n.json index 4dfffbb1b..037207c0e 100644 --- a/i18n/hr.i18n.json +++ b/i18n/hr.i18n.json @@ -96,6 +96,7 @@ "add-members": "Dodaj korisnika", "added": "Dodano", "addMemberPopup-title": "Korisnici", + "memberPopup-title": "Member Settings", "admin": "Administrator", "admin-desc": "Može pregledavati i uređivati ​​kartice, uklanjati članove i mijenjati postavke ploče.", "admin-announcement": "Obavijest", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "apply": "Primjeni", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Preseli u arhivu", "archive-all": "Preseli sve u arhivu", "archive-board": "Preseli ploču u arhivu", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Dospijeće", "card-due-on": "Dospijeće na", "card-spent": "Provedeno vrijeme", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Obrisati karticu?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Oznake", "cardMembersPopup-title": "Korisnici", @@ -268,14 +273,18 @@ "comment-placeholder": "Napiši komentar", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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.", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Pretraži", "copyCardPopup-title": "Kopiraj karticu", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Promijeni datum početka", "editCardDueDatePopup-title": "Promijeni datum dospijeća", "editCustomFieldPopup-title": "Uredi polje", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Promijeni oznaku", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Da", "no": "Ne", "accounts": "Računi", "accounts-allowEmailChange": "Dozvoli promjenu Email-a", "accounts-allowUserNameChange": "Dozvoli promjenu korisničkog imena", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Ukloniti", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/hu.i18n.json b/i18n/hu.i18n.json index dfdaa8761..74fc1465d 100644 --- a/i18n/hu.i18n.json +++ b/i18n/hu.i18n.json @@ -1,9 +1,9 @@ { - "accept": "Elfogadás", + "accept": "Elfogad", "act-activity-notify": "Tevékenység értesítés", - "act-addAttachment": "hozzáadta __attachment__ mellékletet __card__ kártyához __list__ listán __swimlane__ elválasztón __board__ táblán", - "act-deleteAttachment": "törölte __attachment__ mellékletet __card__ kártyához __list__ listán __swimlane__ elválasztón __board__ táblán", - "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__", + "act-addAttachment": "hozzáadta: __attachment__ mellékletet __card__ kártyához __list__ listán __swimlane__ elválasztón __board__ táblán", + "act-deleteAttachment": "törölte: __attachment__ mellékletet __card__ kártyához __list__ listán __swimlane__ elválasztón __board__ táblán", + "act-addSubtask": "hozzáadott egy Rész-feladatot: __subtask__ \nehhez a Kártyához: __card__ \nezen a Listán: __list__ \nezen az Úszósávon: __swimlane__ \nezen Táblán: __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__", @@ -14,29 +14,29 @@ "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": "befejezte __checklist__ listát ezen a kártyán: __card__ ebben az oszlopban: __list__ ezen az úszósávon: __swimlane__ at ezen a kártyán: __board__", + "act-completeChecklist": "befejezte: __checklist__ listát ezen a kártyán: __card__ ebben az oszlopban: __list__ ezen az úszósávon: __swimlane__ at ezen a kártyán: __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-createBoard": "létrehozott egy Táblát: __board__", + "act-createSwimlane": "létrehozott egy Úszósávot: __swimlane__ ehhez a Táblához: __board__", + "act-createCard": "létrehozta a __card__ kártyát a __list__ listában a __swimlane__ úszósávon a __board__ táblán", "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-addBoardMember": "hozzáadta __member__ felhasználót a __board__ táblához", + "act-archivedBoard": "Archiválásra került ez a Tábla: __board__", "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-importBoard": "importálta ezt a Táblát: __board__", + "act-importCard": "importálta ezt a Táblát: __card__ ehhez a Listához: __list__ ezen Úszósávon: __swimlane__ ezen Táblán: __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-moveCard": "áthelyezte a __card__ kártyát a __board__ táblán a __oldSwimlane__ úszósávon a __oldList__ listáról a __list__ listára a __swimlane__ úszósávon", + "act-moveCardToOtherBoard": "áthelyezte a __card__ kártyát a __oldList__ listáról a __oldSwimlane__ úszósávon a __oldBoard__ tábláról a __list__ listára a __swimlane__ úszósávon a __board__ táblára", "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__", @@ -59,7 +59,7 @@ "activity-removed": "%s eltávolítva innen: %s", "activity-sent": "%s elküldve ide: %s", "activity-unjoined": "%s kilépett a csoportból", - "activity-subtask-added": "Alfeladat hozzáadva ehhez: %s", + "activity-subtask-added": "Rész-feladat hozzáadva ehhez: %s", "activity-checked-item": "Kipipálta %s ebben a Listában: %s ebből: %s", "activity-unchecked-item": "Pipátlanította %s ebben a Listában: %s ebből:%s", "activity-checklist-added": "ellenőrzőlista hozzáadva ehhez: %s", @@ -80,22 +80,23 @@ "activity-dueDate": "átírta a *határidő* dátumát erről: %s erre: %s", "activity-endDate": "átírta a \"befejezés\" dátumát erről: %s erre: %s", "add-attachment": "Melléklet hozzáadása", - "add-board": "Tábla hozzáadása", - "add-template": "Add Template", + "add-board": "Tábla hozzáadás", + "add-template": "Sablon hozzáadása", "add-card": "Kártya hozzáadása", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Kártya hozzáadás a Lista elejére", + "add-card-to-bottom-of-list": "Kártya hozzáadás a Lista végére", "add-swimlane": "Úszósáv hozzáadása", - "add-subtask": "Alfeladat hozzáadása", + "add-subtask": "Rész-feladat hozzáadása", "add-checklist": "Ellenőrzőlista hozzáadása", "add-checklist-item": "Elem hozzáadása az ellenőrzőlistához", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Konvertáld Kártyává", "add-cover": "Borító hozzáadása", "add-label": "Címke hozzáadása", "add-list": "Lista hozzáadása", "add-members": "Tagok hozzáadása", "added": "Hozzáadva", "addMemberPopup-title": "Tagok", + "memberPopup-title": "Tagok beállításai", "admin": "Adminisztrátor", "admin-desc": "Megtekintheti és szerkesztheti a kártyákat, eltávolíthat tagokat, valamint megváltoztathatja a tábla beállításait.", "admin-announcement": "Bejelentés", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "És __count__ egyéb kártya", "apply": "Alkalmaz", "app-is-offline": "Betöltés... kérem várjon!\nHa közben frissíti az oldalt, adatok veszhetnek el.\n(Ha nem töltődik be az oldal, ellenőrizze fut-e a szerver.)", + "app-try-reconnect": "Try to reconnect.", "archive": "Archiváld", "archive-all": "Mindet archiváld", "archive-board": "Archiváld a Táblát", @@ -121,8 +123,8 @@ "archives": "Archiválás", "template": "Sablon", "templates": "Sablonok", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "Sablon Tároló", + "add-template-container": "Sablon Tároló hozzáadása", "assign-member": "Tag hozzárendelése", "attached": "csatolva", "attachment": "Melléklet", @@ -137,7 +139,7 @@ "board-not-found": "A tábla nem található", "board-private-info": "Ez a tábla legyen <strong>személyes</strong>.", "board-public-info": "Ez a tábla legyen <strong>nyilvános</strong>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Fogd és vidd az egérrel az ikonok sorba rendezéséhez. Kattints a Tábla ikonjára a megnyitáshoz.", "boardChangeColorPopup-title": "Tábla hátterének megváltoztatása", "boardChangeTitlePopup-title": "Tábla átnevezése", "boardChangeVisibilityPopup-title": "Láthatóság megváltoztatása", @@ -153,12 +155,14 @@ "board-view-lists": "Listák", "bucket-example": "Mint például „Bakancslista”", "cancel": "Mégse", - "card-archived": "Ezt a Kártyát archiválták", + "card-archived": "A kártya az archív kártyák közé kerül.", "board-archived": "Ezt a Táblát archiválták", "card-comments-title": "Ez a kártya %s hozzászólást tartalmaz.", "card-delete-notice": "A törlés végleges. Az összes műveletet elveszíti, amely ehhez a kártyához tartozik.", - "card-delete-pop": "Az összes művelet el lesz távolítva a tevékenységlistából, és nem lesz képes többé újra megnyitni a kártyát. Nincs visszaállítási lehetőség.", + "card-delete-pop": "A tevékenységnapló kiürítésre kerül, és nem lesz többé lehetősége újra megnyitni a kártyát. Nincs visszaállítási lehetőség.", "card-delete-suggest-archive": "Archiválhatsz egy Kártyát, hogy eltávolítsd a Tábláról de megőrizd a vele kapcsolatos tevékenységeket.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Határidő", "card-due-on": "A határidő lejár", "card-spent": "Eltöltött idő", @@ -185,10 +189,10 @@ "vote-against": "ellene", "deleteVotePopup-title": "Törlöd a szavazást?", "vote-delete-pop": "A Törlés végleges. Minden eseményt elvesztesz, ami ehhez kapcsolódik.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Tervezőpóker indítása", + "card-edit-planning-poker": "Tervezőpóker szerkesztése", + "editPokerEndDatePopup-title": "Tervezőpóker szavazás záróidejének szerkesztése", + "poker-question": "Tervezőpóker ", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -199,14 +203,15 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Vége", + "poker-result-votes": "Szavazatok", + "poker-result-who": "Kicsoda", + "poker-replay": "Újrajátszás", + "set-estimation": "Becslés beállítása", + "deletePokerPopup-title": "Törlöd a Tervezőpókert?", + "poker-delete-pop": "A törlési művelet végleges és nem visszavonható. Minden hozzárendelt esemény is elvész egyben ezen Tervezőpóker megsemmisülésekor.", "cardDeletePopup-title": "Törlöd a kártyát?", + "cardArchivePopup-title": "Archiválod a Kártyát?", "cardDetailsActionsPopup-title": "Kártyaműveletek", "cardLabelsPopup-title": "Címkék", "cardMembersPopup-title": "Tagok", @@ -229,7 +234,7 @@ "changePasswordPopup-title": "Jelszó megváltoztatása", "changePermissionsPopup-title": "Jogosultságok megváltoztatása", "changeSettingsPopup-title": "Beállítások megváltoztatása", - "subtasks": "Alfeladat", + "subtasks": "Rész-feladatok", "checklists": "Ellenőrző-listák", "click-to-star": "Kattints a tábla csillagozásához.", "click-to-unstar": "Kattints a tábla csillagának eltávolításához.", @@ -237,7 +242,7 @@ "close": "Bezárás", "close-board": "Tábla bezárása", "close-board-pop": "Vissza tudod állítani a Táblát, ha az \"Archív\" gombra kattintasz a fejlécnél.", - "close-card": "Close Card", + "close-card": "Kártya bezárása", "color-black": "fekete", "color-blue": "kék", "color-crimson": "karmazsin", @@ -268,14 +273,18 @@ "comment-placeholder": "Megjegyzés írása", "comment-only": "Csak megjegyzés", "comment-only-desc": "Csak megjegyzést írhat a kártyákhoz.", + "comment-delete": "Biztosan törlöd a megjegyzést?", + "deleteCommentPopup-title": "Törlöd a megjegyzést?", "no-comments": "Nincs megjegyzés", "no-comments-desc": "Nem láthatsz hozzászólásokat és eseményeket", "worker": "Dolgozó", "worker-desc": "Csak mozgathat Kártyákat, hozzárendelheti magát Kártyákhoz és megjegyzésekhez", "computer": "Számítógép", - "confirm-subtask-delete-dialog": "Biztosan törlöd az alfeladatot?", - "confirm-checklist-delete-dialog": "Biztosan törlöd a Feladatlistát?", + "confirm-subtask-delete-dialog": "Biztosan törlöd a Rész-feladatot?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kártya hivatkozásának másolása a vágólapra", + "copy-text-to-clipboard": "Szöveg másolása vágólapra", "linkCardPopup-title": "Kártyára hivatkozás", "searchElementPopup-title": "Keresés", "copyCardPopup-title": "Kártya másolása", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Kezdődátum megváltoztatása", "editCardDueDatePopup-title": "Határidő dátumának megváltoztatása", "editCustomFieldPopup-title": "Mező szerkesztése", + "addReactionPopup-title": "Reakció hozzáadása", "editCardSpentTimePopup-title": "Eltöltött idő megváltoztatása", "editLabelPopup-title": "Címke megváltoztatása", "editNotificationPopup-title": "Értesítés szerkesztése", @@ -352,9 +362,9 @@ "error-user-notAllowSelf": "Nem hívhatod meg saját magadat", "error-user-notCreated": "Ez a felhasználó nincs létrehozva", "error-username-taken": "Ez a felhasználónév már foglalt", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", - "error-email-taken": "Az e-mail már foglalt", + "error-orgname-taken": "Ez a szervezetnév már foglalt.", + "error-teamname-taken": "Ez a csapatnév már foglalt.", + "error-email-taken": "Az e-mail cím már foglalt", "export-board": "Tábla exportálása", "export-board-json": "Exportáld a táblát JSON formátumba", "export-board-csv": "Exportáld a táblát CSV (vesszővel elválasztott) formátumba", @@ -362,12 +372,14 @@ "export-board-excel": "Exportáld a Táblát Excelbe", "user-can-not-export-excel": "Felhasználó nem tud Excelbe exportálni", "export-board-html": "Exportáld a táblát HTML (webes) formátumba", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Kártya exportálása", + "export-card-pdf": "Kártya exportálása PDF-be", + "user-can-not-export-card-to-pdf": "A Felhasználó nem exportálhat Kártyát PDF-be.", "exportBoardPopup-title": "Tábla exportálása", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Kártya exportálása", "sort": "Rendezés", + "sorted": "Rendezett", + "remove-sort": "Rendezés eltávolítása", "sort-desc": "Kattints a lista rendezéséhez", "list-sort-by": "Rendezd a Listát e szerint:", "list-label-modifiedAt": "Utolsó hozzáférés ideje", @@ -378,12 +390,12 @@ "list-label-short-sort": "(M)", "filter": "Szűrő", "filter-cards": "Kártyák vagy Listák szűrése", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", + "filter-dates-label": "Dátum szerinti szűrés", + "filter-no-due-date": "Nincs lejártati idő", + "filter-overdue": "Lejárt", + "filter-due-today": "Ma jár le", + "filter-due-this-week": "Ezen a héten jár le", + "filter-due-tomorrow": "Holnap jár le", "list-filter-label": "Cím alapján szűrd a Listákat", "filter-clear": "Szűrő törlése", "filter-labels-label": "Címke alapján szűrés", @@ -426,7 +438,7 @@ "import-csv-placeholder": "CSV / TSV adat beillesztés ide", "import-map-members": "Tagok leképezése", "import-members-map": "Az importált Táblának vannak felhasználói.\nVálaszd ki, kikkel szeretnéd összerendelni.", - "import-members-map-note": "Note: Unmapped members will be assigned to the current user.", + "import-members-map-note": "Megjegyzés: A leképezetlen Tagok az aktuális felhasználóhoz lesznek rendelve.", "import-show-user-mapping": "Tagok leképezésének vizsgálata", "import-user-select": "Válassz egy helyettes felhasználót a meglévők közül", "importMapMembersAddPopup-title": "Válassz Tagot", @@ -445,7 +457,7 @@ "language": "Nyelv", "last-admin-desc": "Nem változtathatja meg a szerepeket, mert legalább egy adminisztrátora szükség van.", "leave-board": "Tábla elhagyása", - "leave-board-pop": "Biztosan el szeretné hagyni ezt a táblát: __boardTitle__? El lesz távolítva a táblán lévő összes kártyáról.", + "leave-board-pop": "Biztosan el szeretné hagyni a __boardTitle__ táblát? El lesz távolítva a tábla összes kártyájáról.", "leaveBoardPopup-title": "Elhagyja a táblát?", "link-card": "Összekapcsolás ezzel a kártyával", "list-archive-cards": "Archiváld a Lista összes Kártyáját", @@ -455,8 +467,8 @@ "set-color-list": "Szín megadása", "listActionPopup-title": "Műveletek felsorolása", "settingsUserPopup-title": "Felhasználói beállítások", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Csapat beállítások", + "settingsOrgPopup-title": "Szervezet Beállítások", "swimlaneActionPopup-title": "Úszósáv Műveletek", "swimlaneAddPopup-title": "Új Úszósáv hozzáadása ez alá", "listImportCardPopup-title": "Trello kártya importálása", @@ -517,7 +529,7 @@ "listDeletePopup-title": "Törli a listát?", "remove-member": "Tag eltávolítása", "remove-member-from-card": "Eltávolítás a kártyáról", - "remove-member-pop": "Eltávolítja __name__ (__username__) felhasználót a tábláról: __boardTitle__? A tag el lesz távolítva a táblán lévő összes kártyáról. Értesítést fog kapni erről.", + "remove-member-pop": "Eltávolítja __name__ (__username__) felhasználót a __boardTitle__ tábláról? A tag a tábla összes kártyájáról el lesz távolítva. Értesítést fog kapni erről.", "removeMemberPopup-title": "Eltávolítja a tagot?", "rename": "Átnevezés", "rename-board": "Tábla átnevezése", @@ -568,15 +580,15 @@ "upload": "Feltöltés", "upload-avatar": "Egy avatár feltöltése", "uploaded-avatar": "Egy avatár feltöltve", - "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", + "custom-top-left-corner-logo-image-url": "Egyedi Bal felső Logo kép URL-je", + "custom-top-left-corner-logo-link-url": "Egyedi Bal felső Logo Link URL-je", + "custom-top-left-corner-logo-height": "Egyedi Bal felső Logo magassága. Alap: 27", + "custom-login-logo-image-url": "Egyedi bejelentkezési Logo kép URL-je", + "custom-login-logo-link-url": "Egyedi bejelentkezési Logo Link URL-je", + "text-below-custom-login-logo": "Egyedi szöveg-alatti bejelentkezési Logo", + "automatic-linked-url-schemes": "Egyedi URL sémák, melyek automatikusan kattinthatóak. Soronként egy URL per séma.", "username": "Felhasználónév", - "import-usernames": "Import Usernames", + "import-usernames": "Felhasználónevek importálása", "view-it": "Megtekintés", "warn-list-archived": "figyelem: ez a Kártya egy archivált Listában van benne", "watch": "Megfigyelés", @@ -615,7 +627,7 @@ "invitation-code": "Meghívási kód", "email-invite-register-subject": "__inviter__ egy meghívás küldött Neked", "email-invite-register-text": "Kedves __user__,\n\n__inviter__ meghív téged egy kanban táblára, hogy együtt dolgozhassatok.\n\nKérlek kattints az alábbi linkre:\n__url__\n\nA meghívás kódja: __icode__\n\nSzép napot :-)", - "email-smtp-test-subject": "SMTP Test Email", + "email-smtp-test-subject": "Teszt Email SMTP-je", "email-smtp-test-text": "Sikeresen elküldött egy e-mailt", "error-invitation-code-not-exist": "A meghívási kód nem létezik", "error-notAuthorized": "Nincs jogosultsága az oldal megtekintéséhez.", @@ -630,10 +642,10 @@ "new-outgoing-webhook": "Új kimenő webhurok", "no-name": "(Ismeretlen)", "Node_version": "Node verzió", - "Meteor_version": "Meteor version", - "MongoDB_version": "MongoDB version", - "MongoDB_storage_engine": "MongoDB storage engine", - "MongoDB_Oplog_enabled": "MongoDB Oplog enabled", + "Meteor_version": "Meteor verzió", + "MongoDB_version": "MongoDB verzió", + "MongoDB_storage_engine": "MongoDB tároló motor", + "MongoDB_Oplog_enabled": "MongoDB Oplog engedélyezett", "OS_Arch": "Operációs rendszer architektúrája", "OS_Cpus": "Operációs rendszer CPU száma", "OS_Freemem": "Operációs rendszer szabad memóriája", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Mező hozzáadása új Kártyákhoz", "always-field-on-card": "Mező hozzáadása minden Kártyához", "showLabel-field-on-card": "Mutassa a Címkék nevét a mini Kártyákon is", + "showSum-field-on-list": "Mutassa a mezők összegét a lista tetején", "yes": "Igen", "no": "Nem", "accounts": "Fiókok", "accounts-allowEmailChange": "E-mail megváltoztatásának engedélyezése", "accounts-allowUserNameChange": "Felhasználónév megváltoztatásának engedélyezése", + "tableVisibilityMode-allowPrivateOnly": "Tábla láthatóság: Csak privát táblák engedélyezettek", + "tableVisibilityMode": "Táblák láthatósága", "createdAt": "Létrehozva", "modifiedAt": "Módosult", "verified": "Ellenőrizve", @@ -672,25 +687,25 @@ "setListColorPopup-title": "Válassz színt", "assigned-by": "Hozzárendelte ", "requested-by": "Igényelte", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Kártyák sorrendezése szám alapján", "board-delete-notice": "A törlés végleges. Minden Lista, Kártya és kapcsolódó esemény megsemmisül ezen a Táblán.", "delete-board-confirm-popup": "Minden Lista, Kártya, Címke és Esemény véglegesen törlésre kerül és nincs rá mód, hogy visszanyerd a Tábla tartalmát. Nincs visszavonási lehetőség sem.", "boardDeletePopup-title": "TÖRLÖD a Táblát?", "delete-board": "Tábla törlése", - "default-subtasks-board": "Al-feladat ehhez a Táblához: __board__", + "default-subtasks-board": "Rész-feladatok ehhez a Táblához: __board__", "default": "Alapértelmezett", "queue": "Feladat sor", - "subtask-settings": "Alfeladat beállítások", + "subtask-settings": "Rész-feladat beállításai", "card-settings": "Kátya beállítások", - "boardSubtaskSettingsPopup-title": "Tábla alfeladat beállítások", + "boardSubtaskSettingsPopup-title": "Tábla Rész-feladatok beállításai", "boardCardSettingsPopup-title": "Kátya beállítások", - "deposit-subtasks-board": "Helyezd az al-feladatokat erre a Táblára:", - "deposit-subtasks-list": "Landing list for subtasks deposited here:", + "deposit-subtasks-board": "Helyezd a Rész-feladatokat erre a Táblára:", + "deposit-subtasks-list": "A Rész-feladatok Teendő-listája ide lett helyezve:", "show-parent-in-minicard": "Mutasd a szülőt a mini-kártyán:", - "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", + "prefix-with-full-path": "Előtag teljes útvonallal", + "prefix-with-parent": "Előtag szülővel", + "subtext-with-full-path": "Szövegrészlet teljes útvonallal", + "subtext-with-parent": "Szövegrészlet szülővel", "change-card-parent": "Szülő cseréje", "parent-card": "Szülő Kártya", "source-board": "Forrás Tábla", @@ -702,7 +717,7 @@ "activity-removed-label-card": "eltávolította ezt a Címkét: \"%s\"", "activity-delete-attach-card": "törölt egy csatolmányt", "activity-set-customfield": "beállított egy egyedi mezőt: \"%s\" erre: \"%s\" itt: %s", - "activity-unset-customfield": "unset custom field '%s' in %s", + "activity-unset-customfield": "megszüntetett egy egyedi mezőt: %s itt: %s", "r-rule": "Szabály", "r-add-trigger": "Új kiváltó ok", "r-add-action": "Új cselekmény", @@ -798,20 +813,20 @@ "r-add-checklist": "Ellenőrzőlista hozzáadása", "r-with-items": "elemekkel", "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-add-swimlane": "Úszósáv hozzáadása", + "r-swimlane-name": "Úszósáv neve", + "r-board-note": "Megjegyzés: hagyd üresen a mezőt, hogy minden lehetséges találattal egyezzen.", + "r-checklist-note": "Megjegyzés: a Teendő-lista elemeit vesszővel elválasztva kell felsorolni.", "r-when-a-card-is-moved": "Amikor egy kártya másik listába kerül", - "r-set": "Set", + "r-set": "Beállít", "r-update": "Frissítés", "r-datefield": "dátum mező", "r-df-start-at": "kezdet", "r-df-due-at": "határidős", "r-df-end-at": "végzett", "r-df-received-at": "megérkezett", - "r-to-current-datetime": "to current date/time", - "r-remove-value-from": "Remove value from", + "r-to-current-datetime": "jelen dátum+ideig", + "r-remove-value-from": "Érték eltávolítása innen:", "ldap": "LDAP", "oauth2": "OAuth2", "cas": "CAS", @@ -825,25 +840,26 @@ "error-undefined": "Valami hiba történt", "error-ldap-login": "Hiba történt bejelentkezés közben", "display-authentication-method": "Hitelelesítési mód mutatása", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Alapértelmezett hitelesítési mód", - "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.", + "duplicate-board": "Tábla duplikálása", + "org-number": "A szervezetek száma:", + "team-number": "A csapatok száma:", + "people-number": "Az emberek száma:", + "swimlaneDeletePopup-title": "Törlöd az Úszósávot?", + "swimlane-delete-pop": "Minden, az Úszósávhoz hozzákapcsolt korábbi esemény is végérvényesen törlődni fog. A műveletet nem lehet később visszavonni.", "restore-all": "Összes visszaállítása", "delete-all": "Összes törlése", "loading": "Betöltés folyamatban, kis türelmet…", - "previous_as": "last time was", - "act-a-dueAt": "megváltoztatta a *határidő* dátumát erre:\n__timeValue__ az új dátum\n__timeOldValue__ volt a régi\nEzen a *Kártyán*: __card__", - "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": "átírta a *határidő* dátumát erre:", - "a-endAt": "modified ending time to be", - "a-startAt": "modified starting time to be", - "a-receivedAt": "modified received time to be", + "previous_as": "az utolsó idő ekkor volt:", + "act-a-dueAt": "megváltoztatta a *határidőt* erre:\n__timeValue__ az új dátum\n__timeOldValue__ volt a régi\nEzen a *Kártyán*: __card__", + "act-a-endAt": "megváltoztatta a *VÉGE* időpontját erre:\n__timeValue__ az új dátum\n__timeOldValue__ volt a régi", + "act-a-startAt": "megváltoztatta a *START* időpontját erre:\n__timeValue__ az új dátum\n__timeOldValue__ volt a régi", + "act-a-receivedAt": "megváltoztatta az *Érkezett* időpontot erre:\n__timeValue__ az új dátum\n__timeOldValue__ volt a régi", + "a-dueAt": "átírta a *határidőt* erre:", + "a-endAt": "átírta a *vége* időpontját erre:", + "a-startAt": "átírta a *kezdet* időpontját erre:", + "a-receivedAt": "átírta az *érkezett* időpontját erre:", "almostdue": "a határidő dátuma %s közeledik", "pastdue": "a határidő dátuma %s már lejárt", "duenow": "a határidő dátuma %s ma van", @@ -852,31 +868,31 @@ "act-almostdue": "emlékeztette a mostani határidő (__timeValue__) közeledtére ezen a Kártyán: __card__", "act-pastdue": "emlékeztette a mostani határidő (__timeValue__) elmúltára ezen a Kártyán: __card__", "act-duenow": "emlékeztette, hogy a mostani határidő (__timeValue__) ma van ezen a Kártyán: __card__", - "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.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", - "accounts-allowUserDelete": "Allow users to self delete their account", + "act-atUserComment": "Megemlítettek a [__board__] Tábla __list__ listáján ezen a kártyán: __card__", + "delete-user-confirm-popup": "Biztosan törlöd ezt a fiókot? Nem lesz visszavonási lehetőséged!", + "delete-team-confirm-popup": "Biztosan törlöd ezt a csapatot? Nem lesz visszavonási lehetőséged!", + "delete-org-confirm-popup": "Biztosan törlöd ezt a szervezetet? Nem lesz visszavonási lehetőséged!", + "accounts-allowUserDelete": "Engedje a felhasználóknak, hogy maguk töröljék a fiókjukat", "hide-minicard-label-text": "Rejtse el a Címke szövegét a mini Kártyákon", - "show-desktop-drag-handles": "Show desktop drag handles", + "show-desktop-drag-handles": "Mutassa a fogd-és-vidd eseményeket", "assignee": "Felelős", "cardAssigneesPopup-title": "Felelős", - "addmore-detail": "Add a more detailed description", - "show-on-card": "Show on Card", + "addmore-detail": "Részletesebb leírás hozzáadása", + "show-on-card": "Mutassa a Kártyán", "new": "Új", - "editOrgPopup-title": "Edit Organization", - "newOrgPopup-title": "New Organization", - "editTeamPopup-title": "Edit Team", - "newTeamPopup-title": "New Team", + "editOrgPopup-title": "Szervezet szerkesztése", + "newOrgPopup-title": "Új szervezet", + "editTeamPopup-title": "Csapat szerkesztése", + "newTeamPopup-title": "Új csapat", "editUserPopup-title": "Felhasználó szerkesztése", "newUserPopup-title": "Új felhasználó", "notifications": "Értesítések", "view-all": "Összes megtekintése", - "filter-by-unread": "Filter by Unread", + "filter-by-unread": "Olvasatlanokra szűkít", "mark-all-as-read": "Összes megjelölése olvasottként", - "remove-all-read": "Remove all read", - "allow-rename": "Allow Rename", - "allowRenamePopup-title": "Allow Rename", + "remove-all-read": "Minden olvasott eltávolítása", + "allow-rename": "Átnevezés engedélyezése", + "allowRenamePopup-title": "Átnevezés engedélyezése", "start-day-of-week": "Állítsa be a hét kezdetének napját", "monday": "hétfő", "tuesday": "kedd", @@ -892,8 +908,8 @@ "last-activity": "Utolsó tevékenység", "voting": "Szavazás", "archived": "Archiválva", - "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", + "delete-linked-card-before-this-card": "Nem törölheted addig ezt a Kártyát, amíg nem törlöd előbb a kapcsolt Kártyákat", + "delete-linked-cards-before-this-list": "Nem törölheted addig ezt a Listát, amíg le nem törölted azokat a Kártyákat, amik ezen Lista Kártyáira mutatnak.", "hide-checked-items": "Kijelölt elemek elrejtése", "task": "Feladat", "create-task": "Új feladat", @@ -925,7 +941,7 @@ "label-not-found": "Ez a Címke nem található: \"%s\"", "label-color-not-found": "Ez a Címke-szín nem található: %s", "user-username-not-found": "\"%s\" nevű felhasználó nem található", - "comment-not-found": "Card with comment containing text '%s' not found.", + "comment-not-found": "Nem található olyan kártya, mely tartalmazza ezt a szöveget: '%s'", "globalSearch-title": "Minden Táblán keress", "no-cards-found": "Nem találtam Kártyát", "one-card-found": "Egy Kártyát találtam", @@ -945,48 +961,48 @@ "operator-member-abbrev": "m", "operator-assignee": "hozzárendelő", "operator-assignee-abbrev": "a", - "operator-creator": "creator", + "operator-creator": "létrehozó", "operator-status": "állapot", "operator-due": "határidő", "operator-created": "létrehozva", "operator-modified": "módosítva", "operator-sort": "rendezés", "operator-comment": "megjegyzés", - "operator-has": "has", - "operator-limit": "limit", + "operator-has": "tartalmaz", + "operator-limit": "határérték", "predicate-archived": "archiválva", - "predicate-open": "open", + "predicate-open": "megnyit", "predicate-ended": "befejezve", "predicate-all": "összes", "predicate-overdue": "késésben", - "predicate-week": "week", - "predicate-month": "month", - "predicate-quarter": "quarter", - "predicate-year": "year", + "predicate-week": "hét", + "predicate-month": "hónap", + "predicate-quarter": "negyedév", + "predicate-year": "év", "predicate-due": "határidős", "predicate-modified": "módosítva", "predicate-created": "létrehozva", - "predicate-attachment": "attachment", - "predicate-description": "description", + "predicate-attachment": "csatolmány", + "predicate-description": "leírás", "predicate-checklist": "feladat-lista", "predicate-start": "kezdet", "predicate-end": "végzett", "predicate-assignee": "hozzárendelő", "predicate-member": "tag", - "predicate-public": "public", - "predicate-private": "private", + "predicate-public": "publikus", + "predicate-private": "privát", "operator-unknown-error": "%s nem egy művelet", "operator-number-expected": "Ez a művelet: __operator__ egy számot vár, de ezt kapta: \"__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", + "operator-sort-invalid": "'%s' szerinti rendezés érvénytelen", + "operator-status-invalid": "Ez nem egy érvényes státusz: '%s'", + "operator-has-invalid": "Ez nem érvényes meglét-ellenőrzés: '%s'", + "operator-limit-invalid": "%s nem egy valós határérték. Pozitív egész szám kell legyen. (Max 2^31)", + "next-page": "Következő Oldal", + "previous-page": "Előző Oldal", "heading-notes": "Jegyzetek", "globalSearch-instructions-heading": "Keresési Utasítások", "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-operators": "Használható műveleti jelek:", "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>*", @@ -1010,43 +1026,43 @@ "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-1": "Többféle operátor is megadható.", "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": "A szöveges keresések immunisak a kis-nagybetűkre.", - "globalSearch-instructions-notes-5": "By default archived cards are not searched.", + "globalSearch-instructions-notes-5": "Alapesetben az archivált Kártyák között nem keres.", "link-to-search": "Link ehhez a kereséshez", "excel-font": "Arial", "number": "Szám", "label-colors": "Címke színek", "label-names": "Címke feliratok", - "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", - "custom-field-stringtemplate": "String Template", + "archived-at": "archiválva lett: ", + "sort-cards": "Kártyák Rendezése", + "cardsSortPopup-title": "Kártyák Rendezése", + "due-date": "Lejártati idő", + "server-error": "Szerver Hiba", + "server-error-troubleshooting": "Kérem küldje el a szerver által generált hibát.\nHa \"Snap\" telepítése van, futtassa ezt: `sudo snap logs wekan.wekan`\n\"Docker\" alapú telepítésnél: `sudo docker logs wekan-app`", + "title-alphabetically": "Cím (Név szint)", + "created-at-newest-first": "Létrehozva (Legújabb elől)", + "created-at-oldest-first": "Létrehozva (Legrégebbi elől)", + "links-heading": "Linkek", + "hide-system-messages-of-all-users": "Minden rendszerüzenet elrejtése minden felhasználónál", + "now-system-messages-of-all-users-are-hidden": "Most már minden rendszerüzenet rejtve lett minden felhasználónál.", + "move-swimlane": "Úszósáv mozhatása", + "moveSwimlanePopup-title": "Úszósáv mozhatása", + "custom-field-stringtemplate": "Szöveg Sablon", "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", "custom-field-stringtemplate-separator": "Separator (use or   for a space)", - "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", - "creator": "Creator", - "filesReportTitle": "Files Report", - "orphanedFilesReportTitle": "Orphaned Files Report", - "reports": "Reports", - "rulesReportTitle": "Rules Report", - "copy-swimlane": "Copy Swimlane", - "copySwimlanePopup-title": "Copy Swimlane", - "display-card-creator": "Display Card Creator", + "custom-field-stringtemplate-item-placeholder": "Nyomj Enter-t több elem hozzáadásához", + "creator": "Létrehozó", + "filesReportTitle": "Fájl Riport", + "orphanedFilesReportTitle": "Elárvult Fájlok Riportja", + "reports": "Riportok", + "rulesReportTitle": "Szabályok Riportja", + "copy-swimlane": "Úszósáv Másolása", + "copySwimlanePopup-title": "Úszósáv Másolása", + "display-card-creator": "Mutassa a Kártya Létrehozóját", "wait-spinner": "Wait Spinner", "Bounce": "Bounce Wait Spinner", "Cube": "Cube Wait Spinner", @@ -1056,8 +1072,58 @@ "Rotateplane": "Rotateplane Wait Spinner", "Scaleout": "Scaleout Wait Spinner", "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "maximize-card": "Teljes képernyős nézet", + "minimize-card": "Kis méretű nézet", + "delete-org-warning-message": "Nem törölhető ez a Szervezet, mert legalább egy felhasználó még hozzá tartozik.", + "delete-team-warning-message": "Nem törölhető ez a Csapat, mert legalább egy felhasználó még hozzá tartozik.", + "subject": "Tárgy", + "details": "Részletek", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Jegy", + "tickets": "Jegyek", + "ticket-number": "Jegy Száma", + "open": "Nyitva", + "pending": "Függőben", + "closed": "Lezárva", + "resolved": "Megoldva", + "cancelled": "Mellőzve", + "history": "Történet", + "request": "Kérés", + "requests": "Kérések", + "help-request": "Segítség Kérés", + "editCardSortOrderPopup-title": "Rendezés Változtatása", + "cardDetailsPopup-title": "Kártya Részletek", + "add-teams": "Csapatok Hozzáadása", + "add-teams-label": "A hozzáadott Csapatok alább listázva:", + "remove-team-from-table": "Biztos vagy benne, hogy eltávolítod ezt a Csapatot a Tábláról?", + "confirm-btn": "Megerősítés", + "remove-btn": "Távolítsd el", + "filter-card-title-label": "Kártya címe alapján Szűrés", + "invite-people-success": "Sikeresen elküldtem a meghívót a regisztrálónak", + "invite-people-error": "Hiba történt a meghívó elküldésekor.", + "can-invite-if-same-mailDomainName": "Email domain neve", + "to-create-teams-contact-admin": "Csapatok létrehozásához lépj kapcsolatba az adminisztrátorral.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Szervezet Hozzáadása", + "add-organizations-label": "A hozzáadott Szervezetek listája alább látható:", + "remove-organization-from-board": "Biztosan eltávolítod ezt a Szervezetet erről a Tábláról?", + "to-create-organizations-contact-admin": "Szervezetek létrehozásához lépj kapcsolatba az adminisztrátorral.", + "custom-legal-notice-link-url": "Egyedi szerzői jogok oldalának URL-je", + "acceptance_of_our_legalNotice": "Folytatáshoz elfogadod a ", + "legalNotice": "szerzői jogokat", + "copied": "Másolva!" } \ No newline at end of file diff --git a/i18n/hy.i18n.json b/i18n/hy.i18n.json index 74470f28f..38de04eac 100644 --- a/i18n/hy.i18n.json +++ b/i18n/hy.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/id.i18n.json b/i18n/id.i18n.json index 8363f84e4..32e990dc4 100644 --- a/i18n/id.i18n.json +++ b/i18n/id.i18n.json @@ -96,6 +96,7 @@ "add-members": "Tambahkan Anggota", "added": "Ditambahkan", "addMemberPopup-title": "Daftar Anggota", + "memberPopup-title": "Setelan Anggota", "admin": "Admin", "admin-desc": "Bisa tampilkan dan sunting kartu, menghapus partisipan, dan merubah setting panel", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Dan__menghitung__kartu lain", "apply": "Terapkan", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Pindahlan ke Arsip", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "card-delete-notice": "Menghapus sama dengan permanen. Anda akan kehilangan semua aksi yang terhubung ke kartu ini", "card-delete-pop": "Semua aksi akan dihapus dari aktivitas dan anda tidak bisa lagi buka kartu ini", "card-delete-suggest-archive": "Kamu bisa memindahkan Kartu ke Arsip untuk menghapusnya dari Papan dan mempertahankan Aktifitas", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Jatuh Tempo", "card-due-on": "Jatuh Tempo pada", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Hapus kartu", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Aksi Kartu", "cardLabelsPopup-title": "Daftar Label", "cardMembersPopup-title": "Daftar Anggota", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Hanya komentar", "comment-only-desc": "Bisa komen hanya di kartu", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "Komputer", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Cari", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Ubah tanggal mulai", "editCardDueDatePopup-title": "Ubah tanggal selesai", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Ubah Label", "editNotificationPopup-title": "Sunting Pemberitahuan", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exspor Panel", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Ya", "no": "Tidak", "accounts": "Akun", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Dibuat pada", "modifiedAt": "Modified at", "verified": "Terverifikasi", @@ -825,6 +840,7 @@ "error-undefined": "Ada yang salah", "error-ldap-login": "Terjadi kesalahan saat mencoba masuk", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplikat Papan", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "hapus", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ig.i18n.json b/i18n/ig.i18n.json index 9d04fcd3c..51700f34c 100644 --- a/i18n/ig.i18n.json +++ b/i18n/ig.i18n.json @@ -96,6 +96,7 @@ "add-members": "Tinye ndị otu ọhụrụ", "added": "Etinyere ", "addMemberPopup-title": "Ndị otu", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Aha", "cardMembersPopup-title": "Ndị otu", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Ee", "no": "Mba", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Ekere na", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/it.i18n.json b/i18n/it.i18n.json index 672585f31..0328c0f4e 100644 --- a/i18n/it.i18n.json +++ b/i18n/it.i18n.json @@ -96,6 +96,7 @@ "add-members": "Aggiungi membri", "added": "Aggiunto/a", "addMemberPopup-title": "Membri", + "memberPopup-title": "Impostazioni membri", "admin": "Amministratore", "admin-desc": "Può vedere e modificare schede, rimuovere membri e modificare le impostazioni della bacheca.", "admin-announcement": "Annunci", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "E __count__ altre schede", "apply": "Applica", "app-is-offline": "Caricamento, attendere prego. Aggiornare la pagina porterà ad una perdita dei dati. Se il caricamento non dovesse funzionare, per favore controlla che il server non sia stato fermato.", + "app-try-reconnect": "Try to reconnect.", "archive": "Sposta nell'archivio", "archive-all": "Sposta tutto nell'archivio", "archive-board": "Sposta la bacheca nell'archivio", @@ -159,6 +161,8 @@ "card-delete-notice": "L'eliminazione è permanente. Tutte le azioni associate a questa scheda andranno perse.", "card-delete-pop": "Tutte le azioni saranno rimosse dal flusso attività e non sarai in grado di riaprire la scheda. Non potrai tornare indietro.", "card-delete-suggest-archive": "Puoi spostare una scheda nell'archivio per rimuoverla dalla bacheca e mantenere la sua attività.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Scadenza", "card-due-on": "Scade il", "card-spent": "Tempo trascorso", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Eliminare scheda?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Azioni scheda", "cardLabelsPopup-title": "Etichette", "cardMembersPopup-title": "Membri", @@ -268,14 +273,18 @@ "comment-placeholder": "Scrivi un commento...", "comment-only": "Solo commenti", "comment-only-desc": "Puoi commentare solo le schede.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Non ci sono commenti.", "no-comments-desc": "Impossibile visualizzare commenti o attività.", "worker": "Lavoratore", "worker-desc": "Può solo spostare schede, assegnarsi una scheda e commentare.", "computer": "Computer", "confirm-subtask-delete-dialog": "Sei sicuro di voler eliminare il sotto-compito?", - "confirm-checklist-delete-dialog": "Sei sicuro di voler eliminare la checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copia link della scheda negli appunti", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Collega scheda", "searchElementPopup-title": "Cerca", "copyCardPopup-title": "Copia scheda", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambia data di inizio", "editCardDueDatePopup-title": "Cambia data di scadenza", "editCustomFieldPopup-title": "Modifica campo", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Cambia tempo trascorso", "editLabelPopup-title": "Modifica etichetta", "editNotificationPopup-title": "Modifica notifiche", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Esporta bacheca", "exportCardPopup-title": "Export card", "sort": "Ordina", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Clicca per ordinare la lista", "list-sort-by": "Ordina lista per:", "list-label-modifiedAt": "Orario ultimo accesso", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Aggiungi campo alle nuove schede", "always-field-on-card": "Aggiungi campo a tutte le schede", "showLabel-field-on-card": "Mostra l'etichetta di campo su minischeda", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Sì", "no": "No", "accounts": "Profili", "accounts-allowEmailChange": "Permetti modifica dell'email", "accounts-allowUserNameChange": "Consenti la modifica del nome utente", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Creato alle", "modifiedAt": "Modificato il", "verified": "Verificato", @@ -825,6 +840,7 @@ "error-undefined": "Qualcosa è andato storto", "error-ldap-login": "C'è stato un errore mentre provavi ad effettuare il login", "display-authentication-method": "Mostra il metodo di autenticazione", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Metodo di autenticazione predefinito", "duplicate-board": "Duplica bacheca", "org-number": "Il numero di organizzazioni è:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Rimuovi", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ja.i18n.json b/i18n/ja.i18n.json index d29a264bb..dc34204c2 100644 --- a/i18n/ja.i18n.json +++ b/i18n/ja.i18n.json @@ -96,6 +96,7 @@ "add-members": "メンバーの追加", "added": "追加しました", "addMemberPopup-title": "メンバー", + "memberPopup-title": "メンバー設定", "admin": "管理", "admin-desc": "カードの閲覧と編集、メンバーの削除、ボードの設定変更が可能", "admin-announcement": "アナウンス", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "apply": "適用", "app-is-offline": "ロード中です、お待ちください。ページを更新するとデータが失われます。ロードが終わらない場合、サーバーが停止していないかどうかを確認してください。", + "app-try-reconnect": "Try to reconnect.", "archive": "アーカイブする", "archive-all": "すべてアーカイブする", "archive-board": "ボードをアーカイブする", @@ -159,6 +161,8 @@ "card-delete-notice": "削除は取り消しできません。このカードに関係するすべてのアクションがなくなります。", "card-delete-pop": "すべての内容がアクティビティから削除されます。この削除は元に戻すことができません。", "card-delete-suggest-archive": "カードをアーカイブするとボードから削除され、アクティビティに保持されます。", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "期限", "card-due-on": "期限日", "card-spent": "作業時間", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "カードを削除しますか?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "カード操作", "cardLabelsPopup-title": "ラベル", "cardMembersPopup-title": "メンバー", @@ -268,14 +273,18 @@ "comment-placeholder": "コメントを書く", "comment-only": "コメントのみ", "comment-only-desc": "カードにのみコメント可能", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "コメントなし", "no-comments-desc": "コメントとアクティビティの閲覧不可。", "worker": "作業者", "worker-desc": "カードの移動、自分への割り当て、コメントが可能。", "computer": "コンピューター", "confirm-subtask-delete-dialog": "本当にサブタスクを削除してもよろしいでしょうか?", - "confirm-checklist-delete-dialog": "本当にチェックリストを削除してもよろしいでしょうか?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "カードへのリンクをクリップボードにコピー", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "カードをリンク", "searchElementPopup-title": "検索", "copyCardPopup-title": "カードをコピー", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "開始日の変更", "editCardDueDatePopup-title": "期限の変更", "editCustomFieldPopup-title": "フィールドを編集", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "作業時間の変更", "editLabelPopup-title": "ラベルの変更", "editNotificationPopup-title": "通知の変更", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "ボードのエクスポート", "exportCardPopup-title": "Export card", "sort": "並べ替え", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "クリックでリストをソート", "list-sort-by": "次によりリストを並べ替え:", "list-label-modifiedAt": "最終アクセス日時", @@ -651,11 +663,14 @@ "automatically-field-on-card": "フィールドを新しいカードに追加", "always-field-on-card": "フィールドをすべてのカードに追加", "showLabel-field-on-card": "ミニカード上のフィールドラベル表示", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "はい", "no": "いいえ", "accounts": "アカウント", "accounts-allowEmailChange": "メールアドレスの変更を許可", "accounts-allowUserNameChange": "ユーザー名の変更を許可", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "作成日時", "modifiedAt": "Modified at", "verified": "認証状況", @@ -825,6 +840,7 @@ "error-undefined": "何らかの問題が発生しています", "error-ldap-login": "ログイン中にエラーが発生しました", "display-authentication-method": "認証方式を表示", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "デフォルトの認証方式", "duplicate-board": "ボードの複製", "org-number": "組織のメンバー数:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "削除", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ka.i18n.json b/i18n/ka.i18n.json index 9b2e451d4..ec66f46d8 100644 --- a/i18n/ka.i18n.json +++ b/i18n/ka.i18n.json @@ -1,6 +1,6 @@ { "accept": "დათანხმება", - "act-activity-notify": "Activity Notification", + "act-activity-notify": "ქმედების შეტყობინება", "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__", @@ -96,6 +96,7 @@ "add-members": "წევრების დამატება", "added": "-მა დაამატა", "addMemberPopup-title": "წევრები", + "memberPopup-title": "მომხმარებლის პარამეტრები", "admin": "ადმინი", "admin-desc": "შეუძლია ნახოს და შეასწოროს ბარათები, წაშალოს წევრები და შეცვალოს დაფის პარამეტრები. ", "admin-announcement": "განცხადება", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "და __count__ სხვა ბარათები", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "card-delete-notice": "წაშლის შემთხვევაში ამ ბარათთან ასცირებული ყველა მოქმედება დაიკარგება.", "card-delete-pop": "ყველა მოქმედება წაიშლება აქტივობების ველიდან და თქვენ აღარ შეგეძლებათ ბარათის ხელახლა გახსნა. დაბრუნება შეუძლებელია.", "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "საბოლოო ვადა ", "card-due-on": "საბოლოო ვადა", "card-spent": "დახარჯული დრო", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "წავშალოთ ბარათი? ", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "ბარათის მოქმედებები", "cardLabelsPopup-title": "ნიშნები", "cardMembersPopup-title": "წევრები", @@ -268,14 +273,18 @@ "comment-placeholder": "დაწერეთ კომენტარი", "comment-only": "მხოლოდ კომენტარები", "comment-only-desc": "თქვენ შეგიძლიათ კომენტარის გაკეთება მხოლოდ ბარათებზე.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "კომპიუტერი", "confirm-subtask-delete-dialog": "დარწმუნებული ხართ, რომ გსურთ ქვესაქმიანობის წაშლა? ", - "confirm-checklist-delete-dialog": "დარწმუნებული ხართ, რომ გსურთ კატალოგის წაშლა ? ", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "დააკოპირეთ ბარათის ბმული clipboard-ზე", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "ძებნა", "copyCardPopup-title": "ბარათის ასლი", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "დაწყების დროის შეცვლა", "editCardDueDatePopup-title": "შეცვალეთ დედლაინი", "editCustomFieldPopup-title": "ველების შესწორება", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "დახარჯული დროის შეცვლა", "editLabelPopup-title": "ნიშნის შეცვლა", "editNotificationPopup-title": "შეტყობინებების შესწორება", @@ -367,9 +377,11 @@ "user-can-not-export-card-to-pdf": "User can not export card to PDF", "exportBoardPopup-title": "დაფის ექსპორტი", "exportCardPopup-title": "Export card", - "sort": "Sort", - "sort-desc": "Click to Sort List", - "list-sort-by": "Sort the List By:", + "sort": "დალაგება", + "sorted": "Sorted", + "remove-sort": "Remove sort", + "sort-desc": "დააკლიკეთ ჩამონათვალის დალაგებისთვის", + "list-sort-by": "ჩამონათვალის დალაგება: ", "list-label-modifiedAt": "Last Access Time", "list-label-title": "Name of the List", "list-label-sort": "Your Manual Order", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "დიახ", "no": "არა", "accounts": "ანგარიშები", "accounts-allowEmailChange": "ელ.ფოსტის ცვლილების უფლების დაშვება", "accounts-allowUserNameChange": "მომხმარებლის სახელის ცვლილების უფლების დაშვება ", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "შექმნილია", "modifiedAt": "Modified at", "verified": "შემოწმებული", @@ -672,7 +687,7 @@ "setListColorPopup-title": "Choose a color", "assigned-by": "უფლებამოსილების გამცემი ", "requested-by": "მომთხოვნი", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "ბარათების დალაგება ნომრის მიხედვით", "board-delete-notice": "წაშლის შემთხვევაში თქვენ დაკარგავთ ამ დაფასთან ასოცირებულ ყველა მონაცემს მათ შორის : ჩამონათვალს, ბარათებს და მოქმედებებს. ", "delete-board-confirm-popup": "ყველა ჩამონათვალი, ბარათი, ნიშანი და აქტივობა წაიშლება და თქვენ ვეღარ შეძლებთ მის აღდგენას. ", "boardDeletePopup-title": "წავშალოთ დაფა? ", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -908,8 +924,8 @@ "card": "Card", "board": "Board", "context-separator": "/", - "myCardsSortChange-title": "My Cards Sort", - "myCardsSortChangePopup-title": "My Cards Sort", + "myCardsSortChange-title": "ჩემი ბარათების დალაგება", + "myCardsSortChangePopup-title": "ჩემი ბარათების დალაგება", "myCardsSortChange-choice-board": "By Board", "myCardsSortChange-choice-dueat": "By Due Date", "dueCards-title": "Due Cards", @@ -950,7 +966,7 @@ "operator-due": "due", "operator-created": "created", "operator-modified": "modified", - "operator-sort": "sort", + "operator-sort": "დალაგება", "operator-comment": "comment", "operator-has": "has", "operator-limit": "limit", @@ -1022,8 +1038,8 @@ "label-colors": "Label Colors", "label-names": "Label Names", "archived-at": "archived at", - "sort-cards": "Sort Cards", - "cardsSortPopup-title": "Sort Cards", + "sort-cards": "ბარათების დალაგება", + "cardsSortPopup-title": "ბარათების დალაგება", "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`", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/km.i18n.json b/i18n/km.i18n.json index 1da694e3a..d0440bf07 100644 --- a/i18n/km.i18n.json +++ b/i18n/km.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ko.i18n.json b/i18n/ko.i18n.json index a2875e6dc..a6671a326 100644 --- a/i18n/ko.i18n.json +++ b/i18n/ko.i18n.json @@ -96,6 +96,7 @@ "add-members": "멤버 추가", "added": "추가됨", "addMemberPopup-title": "멤버", + "memberPopup-title": "멤버 설정", "admin": "관리자", "admin-desc": "카드를 보거나 수정하고, 멤버를 삭제하고, 보드에 대한 설정을 수정할 수 있습니다.", "admin-announcement": "공지사항", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "__count__ 개의 다른 카드들", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "보관으로 이동", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "card-delete-notice": "영구 삭제입니다. 이 카드와 관련된 모든 작업들을 잃게됩니다.", "card-delete-pop": "모든 작업이 활동 내역에서 제거되며 카드를 다시 열 수 없습니다. 복구가 안되니 주의하시기 바랍니다.", "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "마감기한", "card-due-on": "종료일", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "카드를 삭제합니까?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "카드 액션", "cardLabelsPopup-title": "라벨", "cardMembersPopup-title": "멤버", @@ -268,14 +273,18 @@ "comment-placeholder": "댓글 입력", "comment-only": "댓글만 입력 가능", "comment-only-desc": "카드에 댓글만 달수 있습니다.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "댓글 없음", "no-comments-desc": "댓글과 활동내역을 볼 수 없습니다.", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "내 컴퓨터", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "정말로 체크리스트를 삭제하실 건가요?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "클립보드에 카드의 링크가 복사되었습니다.", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "검색", "copyCardPopup-title": "카드 복사", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "시작일 변경", "editCardDueDatePopup-title": "종료일 변경", "editCustomFieldPopup-title": "필드 수정", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "라벨 변경", "editNotificationPopup-title": "알림 수정", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "보드 내보내기", "exportCardPopup-title": "Export card", "sort": "분류", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "보드 복사", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "제거", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/lt.i18n.json b/i18n/lt.i18n.json index 76864a1c4..6ba6343be 100644 --- a/i18n/lt.i18n.json +++ b/i18n/lt.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/lv.i18n.json b/i18n/lv.i18n.json index e40d59bef..a3cda74f7 100644 --- a/i18n/lv.i18n.json +++ b/i18n/lv.i18n.json @@ -96,6 +96,7 @@ "add-members": "Pievienot dalībniekus", "added": "Pievienots", "addMemberPopup-title": "Dalībnieki", + "memberPopup-title": "Dalībnieka iestatījumi", "admin": "Administrators", "admin-desc": "Var skatīt un labot kartiņas, noņemt dalībniekus un mainīt dēļa iestatījumus", "admin-announcement": "Paziņojums", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Un __count__ citas kartiņas", "apply": "Saglabāt", "app-is-offline": "Notiek ielāde, lūdzu uzgaidiet. Lapas pārlāde izraisīs datu zudumu. Ja neizdodas ielāde, lūdzu pārbaudiet, vai serveris nav apstājies.", + "app-try-reconnect": "Try to reconnect.", "archive": "Pārvietot uz arhīvu", "archive-all": "Pārvietot visu uz arhīvu", "archive-board": "Pārvietot dēli uz arhīvu", @@ -159,6 +161,8 @@ "card-delete-notice": "Dzēšana ir neatgriezeniska. Jūs zaudēsiet visas ar kartiņu saistītās darbības.", "card-delete-pop": "Visas darbības no saraksta tiks noņemtas un jūs vairs nevarēsiet kartiņu atvērt. Darbību nevar atsaukt.", "card-delete-suggest-archive": "Lai kartiņu noņemtu no dēļa nezaudējot darbības, arhivējiet to.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Termiņš", "card-due-on": "Termiņa beigas", "card-spent": "Patērētais laiks", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Dzēst kartiņu?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Kartiņas darbības", "cardLabelsPopup-title": "Birkas", "cardMembersPopup-title": "Dalībnieki", @@ -268,14 +273,18 @@ "comment-placeholder": "Rakstīt komentāru", "comment-only": "Tikai komentēt", "comment-only-desc": "Var komentēt tikai kartiņā.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Nav komentāru", "no-comments-desc": "Nevar redzēt komentārus un darbības.", "worker": "Darbonis", "worker-desc": "Var tikai pārvietot kartiņas, pievienot sevi kartiņai un komentēt.", "computer": "Dators", "confirm-subtask-delete-dialog": "Vai tiešām vēlaties dzēst apakšuzdevumu?", - "confirm-checklist-delete-dialog": "Vai tiešam vēlaties dzēst kontrolsarakstu?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopet kartiņas saiti starpliktuvē", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Kartiņas saite", "searchElementPopup-title": "Meklēt", "copyCardPopup-title": "Kopēt kartiņu", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Mainīt sākuma datumu", "editCardDueDatePopup-title": "Mainīt termiņu", "editCustomFieldPopup-title": "Labot lauku", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Mainīt patērēto laiku", "editLabelPopup-title": "Mainīt birku", "editNotificationPopup-title": "Labot ziņojumu", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Eksportēt dēli", "exportCardPopup-title": "Export card", "sort": "Kārtot", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Spiediet, lai kārtotu sarakstu", "list-sort-by": "Kārtot sarakstu pēc:", "list-label-modifiedAt": "Uzskaitīt piekļuves laiku", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Add field to new cards", "always-field-on-card": "Add field to all cards", "showLabel-field-on-card": "Rādīt lauku nosaukumus mini kartiņā", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Jā", "no": "Nē", "accounts": "Konti", "accounts-allowEmailChange": "Ļaut e-pasta maiņu", "accounts-allowUserNameChange": "Ļaut lietotājvārda maiņu", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Izveidots", "modifiedAt": "Modified at", "verified": "Apstiprināts", @@ -825,6 +840,7 @@ "error-undefined": "Kaut kas nogāja greizi", "error-ldap-login": "Pierakstoties notika kļūda", "display-authentication-method": "Rādīt autentifikācijas metodi", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Noklusētā autentifikācijas metode", "duplicate-board": "Dublēt dēli", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Noņemt", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/mk.i18n.json b/i18n/mk.i18n.json index 47b390ed5..3b8768278 100644 --- a/i18n/mk.i18n.json +++ b/i18n/mk.i18n.json @@ -96,6 +96,7 @@ "add-members": "Додави членови", "added": "Додадено", "addMemberPopup-title": "Членови", + "memberPopup-title": "Настройки на профила", "admin": "Администратор", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Съобщение", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Премести во Архива", "archive-all": "Премести всички во Архива", "archive-board": "Премести Таблото во Архива", @@ -159,6 +161,8 @@ "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": "Можете да преместите картата во Архива, за да я премахнете от Таблото и така да запазите активността в него.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Готова за", "card-due-on": "Готова за", "card-spent": "Изработено време", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Желаете да изтриете картата?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Опции", "cardLabelsPopup-title": "Етикети", "cardMembersPopup-title": "Членови", @@ -268,14 +273,18 @@ "comment-placeholder": "Напиши коментар", "comment-only": "Само коментари", "comment-only-desc": "Може да коментира само в карти.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "Компјутер", "confirm-subtask-delete-dialog": "Сигурен ли сте, дека сакате да изтриете подзадачата?", - "confirm-checklist-delete-dialog": "Сигурни ли сте, дека сакате да изтриете този чеклист?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Копирай връзката на картата в клипборда", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Поврзи картичка", "searchElementPopup-title": "Барај", "copyCardPopup-title": "Копирај картичка", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Промени началната дата", "editCardDueDatePopup-title": "Промени датата за готовност", "editCustomFieldPopup-title": "Промени Полето", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Промени изработеното време", "editLabelPopup-title": "Промяна на Етикета", "editNotificationPopup-title": "Промени известията", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Експортиране на Табло", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Да", "no": "Не", "accounts": "Профили", "accounts-allowEmailChange": "Разреши промяна на имейла", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Създаден на", "modifiedAt": "Modified at", "verified": "Потвърден", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/mn.i18n.json b/i18n/mn.i18n.json index 1f2b3a709..a32b7f2e3 100644 --- a/i18n/mn.i18n.json +++ b/i18n/mn.i18n.json @@ -96,6 +96,7 @@ "add-members": "Гишүүд нэмэх", "added": "Нэмсэн", "addMemberPopup-title": "Гишүүд", + "memberPopup-title": "Гишүүний тохиргоо", "admin": "Админ", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Гишүүд", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Эхлэх өдрийг өөрчлөх", "editCardDueDatePopup-title": "Дуусах өдрийг өөрчлөх", "editCustomFieldPopup-title": "Талбарыг засварлах", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Зарцуулсан хугацааг засварлах", "editLabelPopup-title": "Шошгыг өөрчлөх", "editNotificationPopup-title": "Мэдэгдэл тохируулах", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ms-MY.i18n.json b/i18n/ms-MY.i18n.json new file mode 100644 index 000000000..6ba6343be --- /dev/null +++ b/i18n/ms-MY.i18n.json @@ -0,0 +1,1129 @@ +{ + "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-template": "Add Template", + "add-card": "Add Card", + "add-card-to-top-of-list": "Add Card to Top of List", + "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-swimlane": "Add Swimlane", + "add-subtask": "Add Subtask", + "add-checklist": "Add Checklist", + "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-cover": "Add Cover", + "add-label": "Add Label", + "add-list": "Add List", + "add-members": "Add Members", + "added": "Added", + "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", + "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.", + "app-try-reconnect": "Try to reconnect.", + "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", + "template-container": "Template Container", + "add-template-container": "Add Template Container", + "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>.", + "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", + "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.", + "cardStartPlanningPokerPopup-title": "Start a Planning Poker", + "card-edit-planning-poker": "Edit Planning Poker", + "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "poker-question": "Planning Poker", + "poker-one": "1", + "poker-two": "2", + "poker-three": "3", + "poker-five": "5", + "poker-eight": "8", + "poker-thirteen": "13", + "poker-twenty": "20", + "poker-forty": "40", + "poker-oneHundred": "100", + "poker-unsure": "?", + "poker-finish": "Finish", + "poker-result-votes": "Votes", + "poker-result-who": "Who", + "poker-replay": "Replay", + "set-estimation": "Set Estimation", + "deletePokerPopup-title": "Delete planning poker?", + "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", + "cardDetailsActionsPopup-title": "Card Actions", + "cardLabelsPopup-title": "Labels", + "cardMembersPopup-title": "Members", + "cardMorePopup-title": "More", + "cardTemplatePopup-title": "Create template", + "cards": "Cards", + "cards-count": "Cards", + "cards-count-one": "Card", + "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.", + "close-card": "Close Card", + "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.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", + "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-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", + "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text 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", + "addReactionPopup-title": "Add reaction", + "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", + "export-card": "Export card", + "export-card-pdf": "Export card to PDF", + "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "exportBoardPopup-title": "Export board", + "exportCardPopup-title": "Export card", + "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove 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", + "filter-dates-label": "Filter by date", + "filter-no-due-date": "No due date", + "filter-overdue": "Overdue", + "filter-due-today": "Due today", + "filter-due-this-week": "Due this week", + "filter-due-tomorrow": "Due tomorrow", + "list-filter-label": "Filter List by Title", + "filter-clear": "Clear filter", + "filter-labels-label": "Filter by label", + "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", + "settingsTeamPopup-title": "Team Settings", + "settingsOrgPopup-title": "Organization 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", + "showSum-field-on-list": "Show sum of fields at top of list", + "yes": "Yes", + "no": "No", + "accounts": "Accounts", + "accounts-allowEmailChange": "Allow Email Change", + "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", + "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", + "card-sorting-by-number": "Card sorting by number", + "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", + "oidc-button-text": "Customize the OIDC button text", + "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.", + "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", + "delete-org-confirm-popup": "Are you sure you want to delete this organization? 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-creator": "creator", + "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-creator": "`__operator_creator__:<username>` - cards where *<username>* is the card's creator", + "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", + "custom-field-stringtemplate": "String Template", + "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", + "custom-field-stringtemplate-separator": "Separator (use or   for a space)", + "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", + "creator": "Creator", + "filesReportTitle": "Files Report", + "orphanedFilesReportTitle": "Orphaned Files Report", + "reports": "Reports", + "rulesReportTitle": "Rules Report", + "copy-swimlane": "Copy Swimlane", + "copySwimlanePopup-title": "Copy Swimlane", + "display-card-creator": "Display Card Creator", + "wait-spinner": "Wait Spinner", + "Bounce": "Bounce Wait Spinner", + "Cube": "Cube Wait Spinner", + "Cube-Grid": "Cube-Grid Wait Spinner", + "Dot": "Dot Wait Spinner", + "Double-Bounce": "Double Bounce Wait Spinner", + "Rotateplane": "Rotateplane Wait Spinner", + "Scaleout": "Scaleout Wait Spinner", + "Wave": "Wave Wait Spinner", + "maximize-card": "Maximize Card", + "minimize-card": "Minimize Card", + "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" +} \ No newline at end of file diff --git a/i18n/nb.i18n.json b/i18n/nb.i18n.json index d29dc5b91..feb1d429a 100644 --- a/i18n/nb.i18n.json +++ b/i18n/nb.i18n.json @@ -81,7 +81,7 @@ "activity-endDate": "redigert sluttdato %s av %s", "add-attachment": "Legg til Vedlegg", "add-board": "Legg til Tavle", - "add-template": "Add Template", + "add-template": "Legg til Mal", "add-card": "Legg til Kort", "add-card-to-top-of-list": "Legg til Kort på Toppen av Listen", "add-card-to-bottom-of-list": "Legg til Kort på Bunnen av Listen", @@ -89,13 +89,14 @@ "add-subtask": "Legg til Underoppgave", "add-checklist": "Legg til Sjekkliste", "add-checklist-item": "Nytt punkt på sjekklisten", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Koverter til Kort", "add-cover": "Nytt omslag", "add-label": "Legg til Etikett", "add-list": "Legg til Liste", "add-members": "Legg til medlemmer", "added": "Lagt til", "addMemberPopup-title": "Medlemmer", + "memberPopup-title": "Innstillinger Medlem", "admin": "Admin", "admin-desc": "Kan se og redigere kort, fjerne medlemmer og endre innstillingene for tavlen.", "admin-announcement": "Kunngjøring", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Og __count__ andre kort", "apply": "Lagre", "app-is-offline": "Laster, vennligst vent. Oppdatering av siden vil forårsake datatap. Dersom oppdatering ikke hjelper, vennligst sjekk at servertjenesten ikke har stoppet opp.", + "app-try-reconnect": "Try to reconnect.", "archive": "Flytt til Arkiv", "archive-all": "Flytt alt til Arkiv", "archive-board": "Flytt Tavle til Arkiv", @@ -121,8 +123,8 @@ "archives": "Arkiv", "template": "Mal", "templates": "Maler", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "Malgruppe", + "add-template-container": "Legg til Malgruppe", "assign-member": "Tildel Medlem", "attached": "la ved", "attachment": "Vedlegg", @@ -159,6 +161,8 @@ "card-delete-notice": "Sletting er permanent. Du vil miste alle hendelser knyttet til dette kortet.", "card-delete-pop": "Alle handlinger vil fjernes fra feeden for aktiviteter og du vil ikke kunne åpne kortet på nytt. Det er ingen mulighet å angre.", "card-delete-suggest-archive": "Du kan flytte kortet til Arkivet for å fjerne det fra tavlen og bevare aktivteten.", + "card-archive-pop": "Kortet vil ikke bli synlig i denne listen etter arkivering", + "card-archive-suggest-cancel": "Du kan gjenopprette kortet fra arkivet seinere", "card-due": "Frist", "card-due-on": "Utløpsfrist", "card-spent": "Forbrukt tid", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Slett rangering", "poker-delete-pop": "Sletting er permanent. Du vil miste alle aksjoner assosiert med rangeringen.", "cardDeletePopup-title": "Slett kort?", + "cardArchivePopup-title": "Arkiver Kort?", "cardDetailsActionsPopup-title": "Behandling kort", "cardLabelsPopup-title": "Etiketter", "cardMembersPopup-title": "Medlemmer", @@ -268,14 +273,18 @@ "comment-placeholder": "Skriv kommentar", "comment-only": "Kun kommentar", "comment-only-desc": "Kun kommentar på kort.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Ingen kommentarer", "no-comments-desc": "Kan ikke se kommentarer eller aktiviteter.", "worker": "Arbeider", "worker-desc": "Kan bare flytte kort, tildele kort til seg selv og kommentere.", "computer": "Datamaskin", "confirm-subtask-delete-dialog": "Er du sikker på at du vil slette underoppgaven?", - "confirm-checklist-delete-dialog": "Er du sikker på at du vil slette sjekklisten?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopier lenke", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Kort", "searchElementPopup-title": "Søk", "copyCardPopup-title": "Kopier Kort", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Endre start dato", "editCardDueDatePopup-title": "Endre forfallsdato", "editCustomFieldPopup-title": "Redigere felt", + "addReactionPopup-title": "Legg til reaksjon", "editCardSpentTimePopup-title": "Endre forbrukt tid", "editLabelPopup-title": "Endre Etikett", "editNotificationPopup-title": "Endre Varsel", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Eksporter tavle", "exportCardPopup-title": "Eksportér kort", "sort": "Sorter", + "sorted": "Sortert", + "remove-sort": "Fjert sortering", "sort-desc": "Klikk for sortering liste", "list-sort-by": "Sorter liten etter:", "list-label-modifiedAt": "Siste innlogging", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Legg til felt på nye kort", "always-field-on-card": "Legg til felt på alle kort", "showLabel-field-on-card": "Vis feltetikett på minikort", + "showSum-field-on-list": "Vis sum av felt på toppen av listen", "yes": "Ja", "no": "Nei", "accounts": "Konto", "accounts-allowEmailChange": "Tillat endring e-post", "accounts-allowUserNameChange": "Tillat endring brukernavn", + "tableVisibilityMode-allowPrivateOnly": "Synlighet Tavle: Tillat kun private tavler", + "tableVisibilityMode": "Synlighet Tavler", "createdAt": "Opprettet på", "modifiedAt": "Endret kl. ", "verified": "Verifisert", @@ -825,6 +840,7 @@ "error-undefined": "Noe gikk galt", "error-ldap-login": "En feil oppstod i forbindelse med pålogging", "display-authentication-method": "Vis autentiseringsmetode", + "oidc-button-text": "Tilpass OIDC knappens tekst", "default-authentication-method": "Standard autentiseringsmetode", "duplicate-board": "Dupliser tavle", "org-number": "Antall Organisasjoner:", @@ -1058,6 +1074,56 @@ "Wave": "Ventehjul - Bølge", "maximize-card": "Maksimer Kort", "minimize-card": "Minimer Kort", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-org-warning-message": "Kan ikke slette organisasjonen, det er minst én bruker knyttet til denne", + "delete-team-warning-message": "Kan ikke slette teamet, det er minst én bruker knyttet til dette", + "subject": "Emne", + "details": "Detaljer", + "carbon-copy": "Kopi til", + "ticket": "Sak", + "tickets": "Saker", + "ticket-number": "Saksnummer", + "open": "Åpen", + "pending": "Venter", + "closed": "Lukket", + "resolved": "Løst", + "cancelled": "Kansellert", + "history": "Historikk", + "request": "Forespørsel", + "requests": "Forespørsler", + "help-request": "Support forespørsel", + "editCardSortOrderPopup-title": "Endre sortering", + "cardDetailsPopup-title": "Kortdetaljer", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Fjern", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/nl.i18n.json b/i18n/nl.i18n.json index 6a1931a09..d71209d71 100644 --- a/i18n/nl.i18n.json +++ b/i18n/nl.i18n.json @@ -83,12 +83,12 @@ "add-board": "Bord Toevoegen", "add-template": "Template Toevoegen", "add-card": "Kaart Toevoegen", - "add-card-to-top-of-list": "Voeg Kaart Boven Aan de Lijst Toe", - "add-card-to-bottom-of-list": "Voeg Kaart Onder Aan de Lijst Toe", + "add-card-to-top-of-list": "Kaart Boven Aan de Lijst Toevoegen", + "add-card-to-bottom-of-list": "Kaart Onder Aan de Lijst Toevoegen", "add-swimlane": "Swimlane Toevoegen", "add-subtask": "Subtaak Toevoegen", "add-checklist": "Checklist toevoegen", - "add-checklist-item": "Voeg item toe aan checklist", + "add-checklist-item": "Item aan checklist toevoegen", "convertChecklistItemToCardPopup-title": "Converteer naar Kaart", "add-cover": "Cover Toevoegen", "add-label": "Label Toevoegen", @@ -96,16 +96,18 @@ "add-members": "Leden Toevoegen", "added": "Toegevoegd", "addMemberPopup-title": "Leden", + "memberPopup-title": "Leden Instellingen", "admin": "Administrator", "admin-desc": "Kan kaarten bekijken en wijzigen, leden verwijderen, en instellingen voor het bord aanpassen.", "admin-announcement": "Melding", "admin-announcement-active": "Systeem melding", - "admin-announcement-title": "Melding van de administrator", + "admin-announcement-title": "Melding van de beheerder", "all-boards": "Alle borden", "and-n-other-card": "En __count__ andere kaarten", "and-n-other-card_plural": "En __count__ andere kaarten", "apply": "Aanmelden", "app-is-offline": "Wekan is aan het laden, wacht alstublieft. Het verversen van de pagina zorgt voor verlies van gegevens. Als Wekan niet laadt, check dan of de Wekan server niet is gestopt. ", + "app-try-reconnect": "Probeer opnieuw te verbinden.", "archive": "Verplaats naar Archief", "archive-all": "Verplaats Alles naar Archief", "archive-board": "Verplaats Bord naar Archief", @@ -138,10 +140,10 @@ "board-private-info": "Dit bord is nu <strong>privé</strong>.", "board-public-info": "Dit bord is nu <strong>openbaar</strong>.", "board-drag-drop-reorder-or-click-open": "Sleep en verplaats om iconen te herordenen. Klik bord-icoon om het bord te openen,", - "boardChangeColorPopup-title": "Verander achtergrond van bord", + "boardChangeColorPopup-title": "Wijzig achtergrond van bord", "boardChangeTitlePopup-title": "Hernoem bord", - "boardChangeVisibilityPopup-title": "Verander zichtbaarheid", - "boardChangeWatchPopup-title": "Verander naar 'Watch'", + "boardChangeVisibilityPopup-title": "Wijzig zichtbaarheid", + "boardChangeWatchPopup-title": "Wijzig naar 'Watch'", "boardMenuPopup-title": "Bord Instellingen", "boardChangeViewPopup-title": "Bord overzicht", "boards": "Borden", @@ -159,6 +161,8 @@ "card-delete-notice": "Verwijdering is permanent. Je raakt alles acties die gekoppeld zijn aan deze kaart kwijt.", "card-delete-pop": "Alle acties worden verwijderd van de activiteiten feed, en er zal geen mogelijkheid zijn om de kaart opnieuw te openen. Er is geen herstelmogelijkheid.", "card-delete-suggest-archive": "Je kunt een kaart naar Archief verplaatsen om die van het bord te verwijderen waarbij de activiteiten behouden blijven.", + "card-archive-pop": "Kaart is na archivering niet meer zichtbaar op deze lijst.", + "card-archive-suggest-cancel": "Je kunt de kaart later terughalen vanuit het Archief.", "card-due": "Verval", "card-due-on": "Vervalt op ", "card-spent": "Gespendeerde tijd", @@ -167,7 +171,7 @@ "card-edit-labels": "Wijzig labels", "card-edit-members": "Wijzig leden", "card-labels-title": "Wijzig de labels van de kaart.", - "card-members-title": "Voeg of verwijder leden van het bord toe aan de kaart.", + "card-members-title": "Leden van het bord aan de kaart toevoegen of verwijderen.", "card-start": "Begin", "card-start-on": "Begint op", "cardAttachmentsPopup-title": "Voeg bestand toe vanuit", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Planning poker verwijderen?", "poker-delete-pop": "Verwijdering is permanent. Je verlies alle acties die gekoppeld zijn aan deze poker sessie.", "cardDeletePopup-title": "Kaart verwijderen?", + "cardArchivePopup-title": "Kaart archiveren?", "cardDetailsActionsPopup-title": "Kaart actie ondernemen", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Leden", @@ -268,14 +273,18 @@ "comment-placeholder": "Schrijf aantekening", "comment-only": "Alleen aantekeningen maken", "comment-only-desc": "Kan alleen op kaarten aantekenen.", + "comment-delete": "Weet je zeker dat je de aantekening wilt verwijderen?", + "deleteCommentPopup-title": "Verwijder aantekening?", "no-comments": "Geen aantekeningen", "no-comments-desc": "Zie geen aantekeningen of activiteiten.", "worker": "Medewerker", "worker-desc": "Kan alleen kaarten verplaatsen, zichzelf aan kaarten koppelen en aantekeningen maken.", "computer": "Computer", "confirm-subtask-delete-dialog": "Weet je zeker dat je de subtaak wilt verwijderen?", - "confirm-checklist-delete-dialog": "Weet je zeker dat je de checklist wilt verwijderen?", + "confirm-checklist-delete-popup": "Weet je zeker dat je de checklist wilt verwijderen?", + "checklistDeletePopup-title": "Checklist Verwijderen?", "copy-card-link-to-clipboard": "Kopieer kaart link naar klembord", + "copy-text-to-clipboard": "Kopieer tekst naar klembord", "linkCardPopup-title": "Koppel Kaart", "searchElementPopup-title": "Zoek", "copyCardPopup-title": "Kopieer kaart", @@ -322,7 +331,8 @@ "editCardStartDatePopup-title": "Wijzig start datum", "editCardDueDatePopup-title": "Wijzig vervaldatum", "editCustomFieldPopup-title": "Wijzig Veld", - "editCardSpentTimePopup-title": "Verander gespendeerde tijd", + "addReactionPopup-title": "Reactie toevoegen", + "editCardSpentTimePopup-title": "Wijzig gespendeerde tijd", "editLabelPopup-title": "Wijzig label", "editNotificationPopup-title": "Wijzig notificatie", "editProfilePopup-title": "Wijzig profiel", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exporteer bord", "exportCardPopup-title": "Exporteer kaart", "sort": "Sorteer", + "sorted": "Gesorteerd", + "remove-sort": "Verwijder sortering", "sort-desc": "Klik om lijst te sorteren", "list-sort-by": "Sorteer lijst op", "list-label-modifiedAt": "Laatste toegangstijd", @@ -443,7 +455,7 @@ "label-delete-pop": "Er is geen herstelmogelijkheid. Deze actie zal het label van alle kaarten verwijderen met de bijbehorende historie.", "labels": "Labels", "language": "Taal", - "last-admin-desc": "Je kunt de permissies niet veranderen omdat er minimaal een administrator moet zijn.", + "last-admin-desc": "Je kunt de permissies niet wijzigen omdat er minimaal een administrator moet zijn.", "leave-board": "Verlaat bord", "leave-board-pop": "Weet je zeker dat je __boardTitle__ wilt verlaten? Je wordt verwijderd van alle kaarten binnen dit bord", "leaveBoardPopup-title": "Bord verlaten?", @@ -458,7 +470,7 @@ "settingsTeamPopup-title": "Team Instellingen", "settingsOrgPopup-title": "Organisatie Instellingen", "swimlaneActionPopup-title": "Swimlane handelingen", - "swimlaneAddPopup-title": "Voeg hieronder een Swimlane toe", + "swimlaneAddPopup-title": "Swimlane hieronder toevoegen", "listImportCardPopup-title": "Importeer een Trello kaart", "listImportCardsTsvPopup-title": "Importeer Excel CSV/TSV", "listMorePopup-title": "Meer", @@ -483,7 +495,7 @@ "multi-selection-member": "Stel lid voor selectie in", "multi-selection-on": "Multi-selectie staat aan", "muted": "Stil", - "muted-info": "Je zal nooit meer geïnformeerd worden bij veranderingen in dit bord.", + "muted-info": "Je zal nooit meer geïnformeerd worden bij wijzigingen op in dit bord.", "my-boards": "Mijn Borden", "name": "Naam", "no-archived-cards": "Geen kaarten in Archief.", @@ -560,7 +572,7 @@ "time": "Tijd", "title": "Titel", "tracking": "Volgen", - "tracking-info": "Je wordt op de hoogte gesteld als er veranderingen zijn aan de kaarten waar je lid of maker van bent.", + "tracking-info": "Je wordt op de hoogte gesteld als er wijzigingen zijn aan de kaarten waar je lid of maker van bent.", "type": "Type", "unassign-member": "Lid verwijderen", "unsaved-description": "Je hebt een niet opgeslagen beschrijving.", @@ -581,7 +593,7 @@ "warn-list-archived": "Let op: deze kaart zit in gearchiveerde lijst", "watch": "Bekijk", "watching": "Bekijken", - "watching-info": "Je zal op de hoogte worden gesteld als er een verandering plaatsvind op dit bord.", + "watching-info": "Je zal op de hoogte worden gesteld als er een wijziging plaatsvind op dit bord.", "welcome-board": "Welkom Bord", "welcome-swimlane": "Mijlpaal 1", "welcome-list1": "Basis", @@ -648,14 +660,17 @@ "minutes": "minuten", "seconds": "seconden", "show-field-on-card": "Toon dit veld op kaart", - "automatically-field-on-card": "Voeg veld toe aan nieuwe kaarten", - "always-field-on-card": "Voeg veld toe aan alle kaarten", + "automatically-field-on-card": "Veld toe aan nieuwe kaarten toevoegen", + "always-field-on-card": "Veld toe aan alle kaarten toevoegen", "showLabel-field-on-card": "Toon veldnaam op minikaart", + "showSum-field-on-list": "Toon totaal van velden bovenaan lijst", "yes": "Ja", "no": "Nee", "accounts": "Accounts", "accounts-allowEmailChange": "Sta E-mailadres wijzigingen toe", "accounts-allowUserNameChange": "Sta Gebruikersnaam wijzigingen toe", + "tableVisibilityMode-allowPrivateOnly": "Zichtbaarheid borden: Sta alleen privé borden toe", + "tableVisibilityMode": "Zichtbaarheid borden", "createdAt": "Aangemaakt op", "modifiedAt": "Gewijzigd op", "verified": "Geverifieerd", @@ -664,7 +679,7 @@ "card-received-on": "Ontvangen op", "card-end": "Einde", "card-end-on": "Eindigt op", - "editCardReceivedDatePopup-title": "Pas ontvangstdatum aan", + "editCardReceivedDatePopup-title": "Wijzig ontvangstdatum", "editCardEndDatePopup-title": "Wijzig einddatum", "setCardColorPopup-title": "Stel kleur in", "setCardActionsColorPopup-title": "Kies een kleur", @@ -704,7 +719,7 @@ "activity-set-customfield": "wijzig maatwerkveld '%s' naar '%s' in %s", "activity-unset-customfield": "wijzig maatwerkveld '%s' in %s", "r-rule": "Regel", - "r-add-trigger": "Voeg signaal toe", + "r-add-trigger": "Signaal toevoegen", "r-add-action": "Actie toevoegen", "r-board-rules": "Bord regels", "r-add-rule": "Regel toevoegen", @@ -718,7 +733,7 @@ "r-is": "is", "r-is-moved": "is verplaatst", "r-added-to": "Toegevoegd aan", - "r-removed-from": "verwijderd van", + "r-removed-from": "Verwijderd van", "r-the-board": "het bord", "r-list": "lijst", "list": "Lijst", @@ -825,6 +840,7 @@ "error-undefined": "Er is iets misgegaan", "error-ldap-login": "Er is een fout opgetreden tijdens het inloggen", "display-authentication-method": "Toon Authenticatiemethode", + "oidc-button-text": "Pas de OIDC-button tekst aan.", "default-authentication-method": "Standaard Authenticatiemethode", "duplicate-board": "Dupliceer Bord", "org-number": "Het aantal organisaties is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximaliseer Kaart", "minimize-card": "Minimaliseer Kaart", "delete-org-warning-message": "Kan deze organisatie niet verwijderen want er is nog minimaal 1 gebruiker lid van.", - "delete-team-warning-message": "Kan dit team niet verwijderen want er is nog minimaal 1 gebruiker lid van." + "delete-team-warning-message": "Kan dit team niet verwijderen want er is nog minimaal 1 gebruiker lid van.", + "subject": "Onderwerp", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticketnummer", + "open": "Open", + "pending": "In behandeling", + "closed": "Gesloten", + "resolved": "Opgelost", + "cancelled": "Geannuleerd", + "history": "Historie", + "request": "Verzoek", + "requests": "Verzoeken", + "help-request": "Hulpverzoek", + "editCardSortOrderPopup-title": "Wijzig Sortering", + "cardDetailsPopup-title": "Kaart Details", + "add-teams": "Teams toevoegen", + "add-teams-label": "Toegevoegde teams worden hieronder getoond:", + "remove-team-from-table": "Weet je zeker dat je dit team van het bord wilt verwijderen?", + "confirm-btn": "Bevestig", + "remove-btn": "Verwijder", + "filter-card-title-label": "Filter kaart op titel", + "invite-people-success": "Uitnodiging om te registreren succesvol verzonden", + "invite-people-error": "Fout tijdens het verzenden van de uitnodiging om te registreren", + "can-invite-if-same-mailDomainName": "Email domeinnaam", + "to-create-teams-contact-admin": "Zoek contact met de beheerder om teams aan te maken.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Organisaties toevoegen", + "add-organizations-label": "Toegevoegde organisaties worden hieronder getoond:", + "remove-organization-from-board": "Weet je zeker dat je deze organisatie van het bord wilt verwijderen?", + "to-create-organizations-contact-admin": "Zoek contact met de beheerder om organisaties aan te maken.", + "custom-legal-notice-link-url": "URL voor maatwerk juridische disclaimer tekst pagina", + "acceptance_of_our_legalNotice": "Als u doorgaat accepteert u onze ", + "legalNotice": "juridische disclaimer tekst", + "copied": "Gekopieerd!" } \ No newline at end of file diff --git a/i18n/oc.i18n.json b/i18n/oc.i18n.json index b710db5ae..ebb614722 100644 --- a/i18n/oc.i18n.json +++ b/i18n/oc.i18n.json @@ -96,6 +96,7 @@ "add-members": "Apondre un participant", "added": "Apondut lo", "addMemberPopup-title": "Participants", + "memberPopup-title": "Paramètres dels participants", "admin": "Administartor", "admin-desc": "As lo drech de legir e modificar las cartas, tirar de participants, e modificar las opcions del tablèu.", "admin-announcement": "Anóncia", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "E __comptar__ cartas de mai", "apply": "Aplicar", "app-is-offline": "Cargament, vos cal esperar. Refrescar la pagina vos va far perdre vòstre trabalh. Se lo cargament es tròp long, vos cal agachar se lo servidor es pas blocat/arrestat.", + "app-try-reconnect": "Try to reconnect.", "archive": "Archivar", "archive-all": "Archivar tot", "archive-board": "Archivar lo tablèu", @@ -159,6 +161,8 @@ "card-delete-notice": "Un còp tirat, pas de posibilitat de tornar enrè", "card-delete-pop": "Totes las accions van èsser quitadas del seguit d'activitat e poiretz pas mai utilizar aquesta carta.", "card-delete-suggest-archive": "Podètz desplaçar una carta dins Archius per la quitar del tablèu e gardar las activitats.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Esperat", "card-due-on": "Esperat lo", "card-spent": "Temps passat", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Suprimir la carta?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Accions sus la carta", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Participants", @@ -268,14 +273,18 @@ "comment-placeholder": "Escrire un comentari", "comment-only": "Comentari solament", "comment-only-desc": "Comentari sus las cartas solament.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Pas cap de comentari", "no-comments-desc": "Podèts pas veire ni los comentaris ni las activitats", "worker": "Worker", "worker-desc": "Can only move cards, assign itself to card and comment.", "computer": "Ordenator", "confirm-subtask-delete-dialog": "Sètz segur de voler quitar aquesta jos-tasca?", - "confirm-checklist-delete-dialog": "Sètz segur de voler quitar aquesta checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Còpia del ligam de la carta", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Ligam de la carta", "searchElementPopup-title": "Cèrca", "copyCardPopup-title": "Còpia de la carta", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Cambiar la data de debuta", "editCardDueDatePopup-title": "Cambiar la data de fin", "editCustomFieldPopup-title": "Modificar los camps", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Cambiar lo temp passat", "editLabelPopup-title": "Cambiar l'etiqueta", "editNotificationPopup-title": "Modificar la notificacion", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar lo tablèu", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Òc", "no": "Non", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verificat", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/pa.i18n.json b/i18n/pa.i18n.json index 76864a1c4..6ba6343be 100644 --- a/i18n/pa.i18n.json +++ b/i18n/pa.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/pl.i18n.json b/i18n/pl.i18n.json index 1ae7f6879..3821e58d2 100644 --- a/i18n/pl.i18n.json +++ b/i18n/pl.i18n.json @@ -1,6 +1,6 @@ { "accept": "Akceptuj", - "act-activity-notify": "Powiadomienia aktywności", + "act-activity-notify": "Powiadomienia o aktywności", "act-addAttachment": "dodał załącznik __attachment__ do karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", "act-deleteAttachment": "usunął załącznik __attachment__ z karty __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", "act-addSubtask": "dodał podzadanie __subtask__ na karcie __card__ na liście __list__ na ścieżce __swimlane__ na tablicy __board__", @@ -81,21 +81,22 @@ "activity-endDate": "zmienił datę zakończenia na %s z %s", "add-attachment": "Dodaj załącznik", "add-board": "Dodaj tablicę", - "add-template": "Add Template", + "add-template": "Dodaj szablon", "add-card": "Dodaj kartę", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Dodaj kartę na początku listy", + "add-card-to-bottom-of-list": "Dodaj kartę na końcu listy", "add-swimlane": "Dodaj ścieżkę", "add-subtask": "Dodaj podzadanie", "add-checklist": "Dodaj czeklistę", "add-checklist-item": "Dodaj element do czeklisty", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Konwertuj na kartę", "add-cover": "Dodaj okładkę", "add-label": "Dodaj etykietę", "add-list": "Dodaj listę", "add-members": "Dodaj użytkowników", "added": "Dodane", "addMemberPopup-title": "Użytkownicy", + "memberPopup-title": "Ustawienia użytkowników", "admin": "Administrator", "admin-desc": "Może widzieć i edytować karty, usuwać użytkowników oraz zmieniać ustawienia tablicy.", "admin-announcement": "Ogłoszenie", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "I __count__ inne karty", "apply": "Zastosuj", "app-is-offline": "Trwa ładowanie, proszę czekać. Odświeżenie strony może spowodować utratę danych. Jeśli strona się nie przeładowuje, upewnij się, że serwer działa poprawnie.", + "app-try-reconnect": "Spróbuj połączyć się ponownie.", "archive": "Przenieś do Archiwum", "archive-all": "Przenieś wszystko do Archiwum", "archive-board": "Przenieś tablicę do Archiwum", @@ -121,8 +123,8 @@ "archives": "Archiwum", "template": "Szablon", "templates": "Szablony", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "Kontener Szablonów", + "add-template-container": "Dodaj Kontener Szablonów", "assign-member": "Dodaj użytkownika", "attached": "dodał załącznik", "attachment": "Załącznik", @@ -132,12 +134,12 @@ "auto-watch": "Automatycznie obserwuj tablice gdy zostaną stworzone", "avatar-too-big": "Awatar jest za duży (maksymalnie 520KB)", "back": "Wstecz", - "board-change-color": "Zmień barwę", + "board-change-color": "Zmień kolor", "board-nb-stars": "%s odznaczeń", "board-not-found": "Nie znaleziono tablicy", "board-private-info": "Ta tablica będzie <strong>prywatna</strong>.", "board-public-info": "Ta tablica będzie <strong>publiczna<strong>.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Użyj techniki przeciągnij i upuść, aby zmienić kolejność ikon tablic. Kliknij ikonę tablicy, by ją otworzyć.", "boardChangeColorPopup-title": "Zmień tło tablicy", "boardChangeTitlePopup-title": "Zmień nazwę tablicy", "boardChangeVisibilityPopup-title": "Zmień widoczność tablicy", @@ -159,6 +161,8 @@ "card-delete-notice": "Usunięcie jest nieodwracalne. Stracisz wszystkie zdarzenia powiązane z tą kartą.", "card-delete-pop": "Wszystkie zdarzenia zostaną usunięte z historii aktywności i nie można będzie ponownie otworzyć karty. Usunięcie jest nieodwracalne.", "card-delete-suggest-archive": "Możesz przenieść kartę do Archiwum, a następnie usunąć ją z tablicy i zachować ją w Aktywności.", + "card-archive-pop": "Karta nie będzie widoczna na tej liście po zarchiwizowaniu.", + "card-archive-suggest-cancel": "Możesz później przywrócić kartę z Archiwum.", "card-due": "Data wykonania", "card-due-on": "Data wykonania", "card-spent": "Czas pracy", @@ -185,9 +189,9 @@ "vote-against": "przeciwko", "deleteVotePopup-title": "Usunąć głos?", "vote-delete-pop": "Usunięcie jest nieodwracalne. Stracisz wszystkie zdarzenia związane z tym głosowaniem.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", + "cardStartPlanningPokerPopup-title": "Uruchom Planning Pokera", + "card-edit-planning-poker": "Edytuj Planning Pokera", + "editPokerEndDatePopup-title": "Zmień datę końcową głosowania w Planning Pokerze", "poker-question": "Planning Poker", "poker-one": "1", "poker-two": "2", @@ -199,14 +203,15 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Koniec", + "poker-result-votes": "Głosy", + "poker-result-who": "Kto", + "poker-replay": "Uruchom ponownie", + "set-estimation": "Ustaw Estymację", + "deletePokerPopup-title": "Usunąć planning pokera?", + "poker-delete-pop": "Usunięcie jest permanentne. Utracisz wszystkie akcje powiązane z tym planning pokerem.", "cardDeletePopup-title": "Usunąć kartę?", + "cardArchivePopup-title": "Zarchiwizować Kartę?", "cardDetailsActionsPopup-title": "Działania na karcie", "cardLabelsPopup-title": "Etykiety", "cardMembersPopup-title": "Użytkownicy", @@ -237,7 +242,7 @@ "close": "Zamknij", "close-board": "Zamknij tablicę", "close-board-pop": "Będziesz w stanie przywrócić tablicę poprzez kliknięcie przycisku \"Archiwizuj\" w nagłówku strony domowej.", - "close-card": "Close Card", + "close-card": "Zamknij Kartę", "color-black": "czarna", "color-blue": "niebieska", "color-crimson": "karmazynowa", @@ -268,14 +273,18 @@ "comment-placeholder": "Dodaj komentarz", "comment-only": "Tylko komentowanie", "comment-only-desc": "Może tylko komentować w kartach.", + "comment-delete": "Czy na pewno chcesz usunąć komentarz?", + "deleteCommentPopup-title": "Usunąć komentarz?", "no-comments": "Bez komentarzy", "no-comments-desc": "Nie widzi komentarzy i aktywności.", "worker": "Pracownik", "worker-desc": "Możesz tylko przenieść karty, przypisać je do siebie i na nich komentować.", "computer": "Komputera", "confirm-subtask-delete-dialog": "Czy jesteś pewien, że chcesz usunąć to podzadanie?", - "confirm-checklist-delete-dialog": "Czy jesteś pewien, że chcesz usunąć czeklistę?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Skopiuj łącze karty do schowka", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Podepnij kartę", "searchElementPopup-title": "Wyszukaj", "copyCardPopup-title": "Skopiuj kartę", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Zmień datę rozpoczęcia", "editCardDueDatePopup-title": "Zmień datę wykonania", "editCustomFieldPopup-title": "Edytuj pole", + "addReactionPopup-title": "Dodaj reakcję", "editCardSpentTimePopup-title": "Zmień ilość przepracowanego czasu", "editLabelPopup-title": "Zmień etykietę", "editNotificationPopup-title": "Zmień tryb powiadamiania", @@ -362,12 +372,14 @@ "export-board-excel": "Eksportuj tablicę w formacie Excel", "user-can-not-export-excel": "Użytkownik nie może wyeksportować tablicy w formacie Excel", "export-board-html": "Eksportuj tablicę do HTML", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Eksportuj kartę", + "export-card-pdf": "Eksportuj kartę do PDF", + "user-can-not-export-card-to-pdf": "Użytkownik nie może wyeksportować karty do PDF", "exportBoardPopup-title": "Eksportuj tablicę", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Eksportuj kartę", "sort": "Sortuj", + "sorted": "Posortowano", + "remove-sort": "Usuń sortowanie", "sort-desc": "Kliknij by sortować listę", "list-sort-by": "Sortuj listę przez:", "list-label-modifiedAt": "Ostatni dostęp", @@ -452,11 +464,11 @@ "list-archive-cards-pop": "To usunie wszystkie karty z tej listy z tej tablicy. Aby przejrzeć karty w Archiwum i przywrócić na tablicę, kliknij \"Menu\" > \"Archiwizuj\".", "list-move-cards": "Przenieś wszystkie karty z tej listy", "list-select-cards": "Zaznacz wszystkie karty z tej listy", - "set-color-list": "Ustaw barwę", + "set-color-list": "Ustaw kolor", "listActionPopup-title": "Działania na liście", "settingsUserPopup-title": "Ustawienia konta użytkownika", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Ustawienia Zespołu", + "settingsOrgPopup-title": "Ustawienia Organizacji", "swimlaneActionPopup-title": "Działania na ścieżce", "swimlaneAddPopup-title": "Dodaj ścieżkę poniżej", "listImportCardPopup-title": "Zaimportuj kartę z Trello", @@ -527,7 +539,7 @@ "rules": "Reguły", "search-cards": "Szukaj w tytułach kart/list oraz opisach i niestandardowych polach na tej tablicy", "search-example": "Wpisz tekst do wyszukania i wciśnij Enter", - "select-color": "Wybierz barwę", + "select-color": "Wybierz kolor", "select-board": "Wybierz tablicę", "set-wip-limit-value": "Ustaw maksymalny limit kart na tej liście", "setWipLimitPopup-title": "Ustaw limit kart na liście", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Dodaj pole do nowych kart", "always-field-on-card": "Dodaj pole do wszystkich kart", "showLabel-field-on-card": "Pokaż pole etykiety w minikarcie", + "showSum-field-on-list": "Pokaż sumę pól na górze listy", "yes": "Tak", "no": "Nie", "accounts": "Konto", "accounts-allowEmailChange": "Zezwól na zmianę adresu email", "accounts-allowUserNameChange": "Zezwól na zmianę nazwy użytkownika", + "tableVisibilityMode-allowPrivateOnly": "Widoczność tablic: Tylko tablice prywatne", + "tableVisibilityMode": "Widoczność tablic", "createdAt": "Utworzone o", "modifiedAt": "Zmodyfikowano", "verified": "Zweryfikowane", @@ -666,13 +681,13 @@ "card-end-on": "Kończy się", "editCardReceivedDatePopup-title": "Zmień datę przyjęcia", "editCardEndDatePopup-title": "Zmień datę zakończenia", - "setCardColorPopup-title": "Ustaw barwę", - "setCardActionsColorPopup-title": "Wybierz barwę", - "setSwimlaneColorPopup-title": "Wybierz barwę", - "setListColorPopup-title": "Wybierz barwę", + "setCardColorPopup-title": "Ustaw kolor", + "setCardActionsColorPopup-title": "Wybierz kolor", + "setSwimlaneColorPopup-title": "Wybierz kolor", + "setListColorPopup-title": "Wybierz kolor", "assigned-by": "Przypisane przez", "requested-by": "Zlecone przez", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Sortowanie kart wg numeru", "board-delete-notice": "Usunięcie jest nieodwracalne. Stracisz wszystkie listy, karty oraz reguły przypisane do tej tablicy.", "delete-board-confirm-popup": "Wszystkie listy, etykiety oraz aktywności zostaną usunięte i nie będziesz w stanie przywrócić zawartości tablicy. Tego nie da się cofnąć.", "boardDeletePopup-title": "Usunąć tablicę?", @@ -755,7 +770,7 @@ "r-label": "etykietę", "r-member": "użytkownika", "r-remove-all": "Usuń wszystkich użytkowników tej karty", - "r-set-color": "Ustaw barwę na", + "r-set-color": "Ustaw kolor na", "r-checklist": "czeklistę", "r-check-all": "Zaznacz wszystkie", "r-uncheck-all": "Odznacz wszystkie", @@ -825,6 +840,7 @@ "error-undefined": "Coś poszło nie tak", "error-ldap-login": "Wystąpił błąd w trakcie logowania", "display-authentication-method": "Wyświetl metodę logowania", + "oidc-button-text": "Własny tekst przycisku OIDC", "default-authentication-method": "Domyślna metoda logowania", "duplicate-board": "Duplikuj tablicę", "org-number": "Liczba organizacji:", @@ -854,8 +870,8 @@ "act-duenow": "przypominał o mijającej właśnie dacie wykonania (__timeValue__) karty __card__", "act-atUserComment": "Zostałeś wspomniany w [__board] __list__/__card__", "delete-user-confirm-popup": "Czy jesteś pewien, że chcesz usunąć te konto? Nie można tego wycofać.", - "delete-team-confirm-popup": "Are you sure you want to delete this team? There is no undo.", - "delete-org-confirm-popup": "Are you sure you want to delete this organization? There is no undo.", + "delete-team-confirm-popup": "Czy na pewno chcesz usunąć ten zespół? Operacji nie można cofnąć.", + "delete-org-confirm-popup": "Czy na pewno chcesz usunąć tą organizację? Operacji nie można cofnąć.", "accounts-allowUserDelete": "Pozwól użytkownikom na usuwanie własnych kont", "hide-minicard-label-text": "Ukryj opisy etykiet minikart", "show-desktop-drag-handles": "Pokaż przeciągnięcia na pulpit", @@ -1012,7 +1028,7 @@ "globalSearch-instructions-operator-limit": "`__operator_limit__:<n>` - gdzie *<n>* to liczba naturalna określająca liczbę kart wyświetlanych na stronie.", "globalSearch-instructions-notes-1": "Można używać wielu kluczy w jednym zapytaniu.", "globalSearch-instructions-notes-2": "Operatory tego samego typu są traktowane jako alternatywy. To znaczy, że zwracane są wszystkie karty, w których spełnione jest przynajmniej jedno z kryteriów.\n`__operator_list__:Dostępne __operator_list__:Wstrzymane` zwróci karty znajdujące się na listach o nazwach *Dostępne* i *Wstrzymane*.", - "globalSearch-instructions-notes-3": "Operatory różnego typu traktowane są jako suma logiczna (*AND*). Zwracane są tylko karty pasujące do wszystkich operatorów różnego typu. `__operator_list__:Dostępne __operator_label__:czerwona` zwróci tylko karty z listy *Dostępne*, które mają etykietę o barwie *czerwona*.", + "globalSearch-instructions-notes-3": "Operatory różnego typu traktowane są jako suma logiczna *AND*. Zwracane są tylko karty pasujące do wszystkich operatorów różnego typu. `__operator_list__:Dostępne __operator_label__:czerwona` zwróci tylko karty z listy *Dostępne*, które mają etykietę w kolorze *czerwonym*.", "globalSearch-instructions-notes-3-2": "Dni można określać za pomocą liczby dodatniej lub ujemnej, albo za pomocą `__predicate_week__`, `__predicate_month__`, `__predicate_quarter__` lub `__predicate_year__` dla bieżącego okresu.", "globalSearch-instructions-notes-4": "W kluczach wyszukiwania wielkie i małe litery można stosować zamiennie.", "globalSearch-instructions-notes-5": "Domyślnie karty zarchiwizowane nie są przeszukiwane.", @@ -1046,18 +1062,68 @@ "rulesReportTitle": "Wykaz reguł", "copy-swimlane": "Skopiuj ścieżkę", "copySwimlanePopup-title": "Kopiowanie ścieżki", - "display-card-creator": "Display Card Creator", - "wait-spinner": "Wait Spinner", - "Bounce": "Bounce Wait Spinner", - "Cube": "Cube Wait Spinner", - "Cube-Grid": "Cube-Grid Wait Spinner", - "Dot": "Dot Wait Spinner", - "Double-Bounce": "Double Bounce Wait Spinner", - "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", - "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", - "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "display-card-creator": "Wyświetlaj autora karty", + "wait-spinner": "Animowany wskaźnik postępu", + "Bounce": "Odbijanie", + "Cube": "Sześcian", + "Cube-Grid": "Sześcian-Siatka", + "Dot": "Kropki", + "Double-Bounce": "Podwójne odbicie", + "Rotateplane": "Obrót płaszczyzny", + "Scaleout": "Skalowanie", + "Wave": "Fala", + "maximize-card": "Maksymalizuj kartę", + "minimize-card": "Minimalizuj kartę", + "delete-org-warning-message": "Nie można usunąć tej organizacji. Do organizacji należy co najmniej jeden użytkownik.", + "delete-team-warning-message": "Nie można usunąć tego zespołu. Do zespołu należy co najmniej jeden użytkownik.", + "subject": "Temat", + "details": "Szczegóły", + "carbon-copy": "Kopia (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Otwarte", + "pending": "Oczekujące", + "closed": "Zamknięte", + "resolved": "Rozwiązane", + "cancelled": "Anulowane", + "history": "Historia", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Zmień Sortowanie", + "cardDetailsPopup-title": "Szczegóły Karty", + "add-teams": "Dodaj zespoły", + "add-teams-label": "Dodane zespoły są wyświetlone poniżej:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Potwierdź", + "remove-btn": "Usuń", + "filter-card-title-label": "Filtruj według tytułu karty", + "invite-people-success": "Zaproszenie do rejestracji zostało wysłane", + "invite-people-error": "Błąd podczas wysyłki zaproszenia do rejestracji", + "can-invite-if-same-mailDomainName": "Nazwa domeny email", + "to-create-teams-contact-admin": "Żeby tworzyć zespoły, skontaktuj się z administratorem.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Dodaj organizacje", + "add-organizations-label": "Dodane organizacje są wyświetlone poniżej:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "Żeby tworzyć organizacje, skontaktuj się z administratorem.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Skopiowano!" } \ No newline at end of file diff --git a/i18n/pt-BR.i18n.json b/i18n/pt-BR.i18n.json index 034dc1269..7c601d504 100644 --- a/i18n/pt-BR.i18n.json +++ b/i18n/pt-BR.i18n.json @@ -96,6 +96,7 @@ "add-members": "Adicionar Membros", "added": "Criado", "addMemberPopup-title": "Membros", + "memberPopup-title": "Configuração de Membros", "admin": "Administrador", "admin-desc": "Pode ver e editar cartões, remover membros e alterar configurações do quadro.", "admin-announcement": "Anúncio", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "E __count__ outros cartões", "apply": "Aplicar", "app-is-offline": "Carregando, por favor espere. Atualizar a página causará perda de dados. Se a carga não funcionar, por favor verifique se o servidor não caiu.", + "app-try-reconnect": "Tentar reconectar", "archive": "Mover para o Arquivo morto", "archive-all": "Mover Tudo para o Arquivo morto", "archive-board": "Mover Quadro para o Arquivo morto", @@ -159,6 +161,8 @@ "card-delete-notice": "A exclusão será permanente. Você perderá todas as ações associadas a este cartão.", "card-delete-pop": "Todas as ações serão excluidas da lista de Atividades e vocês não poderá re-abrir o cartão. Não há como desfazer.", "card-delete-suggest-archive": "Você pode mover um cartão para o Arquivo morto para removê-lo do quadro e preservar a atividade.", + "card-archive-pop": "O cartão não ficará visível nesta lista depois de arquivado.", + "card-archive-suggest-cancel": "Você pode restaurar o cartão do Arquivo posteriormente.", "card-due": "Prazo final", "card-due-on": "Prazo final em", "card-spent": "Tempo Gasto", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Excluir planning poker?", "poker-delete-pop": "A exclusão é permanente. Você perderá todas as ações associadas a este planning poker.", "cardDeletePopup-title": "Excluir Cartão?", + "cardArchivePopup-title": "Arquivar Cartão?", "cardDetailsActionsPopup-title": "Ações do cartão", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Membros", @@ -268,14 +273,18 @@ "comment-placeholder": "Escrever Comentário", "comment-only": "Somente comentários", "comment-only-desc": "Pode comentar apenas em cartões.", + "comment-delete": "Você tem certeza que deseja excluir o comentário?", + "deleteCommentPopup-title": "Excluir comentário?", "no-comments": "Sem comentários", "no-comments-desc": "Sem visualização de comentários e atividades.", "worker": "Colaborador", "worker-desc": "Pode apenas mover cartões, atribuir-se ao cartão e comentar.", "computer": "Computador", "confirm-subtask-delete-dialog": "Tem certeza que deseja excluir a subtarefa?", - "confirm-checklist-delete-dialog": "Tem certeza que quer excluir a lista de verificação?", + "confirm-checklist-delete-popup": "Você tem certeza que deseja excluir a lista de verificação?", + "checklistDeletePopup-title": "Excluir lista de verificação?", "copy-card-link-to-clipboard": "Copiar link do cartão para a área de transferência", + "copy-text-to-clipboard": "Copiar texto para a área de transferência", "linkCardPopup-title": "Ligar Cartão", "searchElementPopup-title": "Buscar", "copyCardPopup-title": "Copiar o cartão", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Altera data de início", "editCardDueDatePopup-title": "Altera prazo final", "editCustomFieldPopup-title": "Editar campo", + "addReactionPopup-title": "Adicionar reação", "editCardSpentTimePopup-title": "Editar tempo gasto", "editLabelPopup-title": "Alterar Etiqueta", "editNotificationPopup-title": "Editar Notificações", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar quadro", "exportCardPopup-title": "Exportar cartão", "sort": "Ordenar", + "sorted": "Ordenado", + "remove-sort": "Remover ordenação", "sort-desc": "Clique para Ordenar Lista", "list-sort-by": "Ordenar a Lista por:", "list-label-modifiedAt": "Último Acesso", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Adicionar campo aos novos cartões", "always-field-on-card": "Adicionar campo a todos os cartões", "showLabel-field-on-card": "Mostrar etiqueta do campo no minicartão", + "showSum-field-on-list": "Mostrar soma dos campos no topo da lista", "yes": "Sim", "no": "Não", "accounts": "Contas", "accounts-allowEmailChange": "Permitir Mudança de e-mail", "accounts-allowUserNameChange": "Permitir alteração de nome de usuário", + "tableVisibilityMode-allowPrivateOnly": "Visibilidade do Quadro: Permitir apenas quadros privados", + "tableVisibilityMode": "Visibilidade do Quadro", "createdAt": "Criado em", "modifiedAt": "Modificado em", "verified": "Verificado", @@ -825,6 +840,7 @@ "error-undefined": "Algo deu errado", "error-ldap-login": "Um erro ocorreu enquanto tentava entrar", "display-authentication-method": "Mostrar Método de Autenticação", + "oidc-button-text": "Personalizar o texto do botão OIDC", "default-authentication-method": "Método de Autenticação Padrão", "duplicate-board": "Duplicar Quadro", "org-number": "O número de organizações é:", @@ -854,8 +870,8 @@ "act-duenow": "está lembrando que o prazo final (__timeValue__) do __card__ é agora", "act-atUserComment": "Você foi mencionado no [__board__] __list__/__card__", "delete-user-confirm-popup": "Você realmente quer apagar esta conta? Não há como desfazer.", - "delete-team-confirm-popup": "Você tem certeza que quer excluir este time? Não há como desfazer.", - "delete-org-confirm-popup": "Você tem certeza que quer excluir esta organização? Não há como desfazer.", + "delete-team-confirm-popup": "Você tem certeza que deseja excluir este time? Não há como desfazer.", + "delete-org-confirm-popup": "Você tem certeza que deseja excluir esta organização? Não há como desfazer.", "accounts-allowUserDelete": "Permitir que usuários apaguem a própria conta", "hide-minicard-label-text": "Esconder rótulo da etiqueta do mini cartão", "show-desktop-drag-handles": "Mostrar alças de arrasto da área de trabalho", @@ -1043,7 +1059,7 @@ "filesReportTitle": "Relatório de Arquivos", "orphanedFilesReportTitle": "Relatório de Arquivos Órfãos", "reports": "Relatórios", - "rulesReportTitle": "Regras de Relatório", + "rulesReportTitle": "Relatório de regras", "copy-swimlane": "Copiar Raia", "copySwimlanePopup-title": "Copiar Raia", "display-card-creator": "Exibir Criador do Cartão", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximizar Cartão", "minimize-card": "Minimizar Cartão", "delete-org-warning-message": "Não é possível excluir esta organização. Existe pelo menos um usuário que pertence a ela.", - "delete-team-warning-message": "Não é possível excluir este time. Existe pelo menos um usuário que pertence a ele." + "delete-team-warning-message": "Não é possível excluir este time. Existe pelo menos um usuário que pertence a ele.", + "subject": "Assunto", + "details": "Detalhes", + "carbon-copy": "Com Cópia (Cc:)", + "ticket": "Tíquete", + "tickets": "Tíquetes", + "ticket-number": "Número do Tíquete", + "open": "Aberto", + "pending": "Pendente", + "closed": "Fechado", + "resolved": "Resolvido", + "cancelled": "Cancelado", + "history": "Histórico", + "request": "Solicitação", + "requests": "Solicitações", + "help-request": "Solicitação de Ajuda", + "editCardSortOrderPopup-title": "Mudar ordenação", + "cardDetailsPopup-title": "Detalhes do Cartão", + "add-teams": "Adicionar times", + "add-teams-label": "Times adicionados são exibidos abaixo:", + "remove-team-from-table": "Você tem certeza que deseja excluir este time do quadro?", + "confirm-btn": "Confirmar", + "remove-btn": "Remover", + "filter-card-title-label": "Filtrar por título do cartão", + "invite-people-success": "Convite para registrar-se enviado com sucesso", + "invite-people-error": "Erro durante envio do convite para registrar-se", + "can-invite-if-same-mailDomainName": "Nome do domínio do e-mail", + "to-create-teams-contact-admin": "Para criação de times, favor entrar em contato com o administrador.", + "Node_heap_total_heap_size": "Pilha do Node: tamanho total da pilha", + "Node_heap_total_heap_size_executable": "Pilha do Node: tamanho total executável da pilha", + "Node_heap_total_physical_size": "Pilha do Node: tamanho físico total", + "Node_heap_total_available_size": " Pilha do Node: tamanho total disponível", + "Node_heap_used_heap_size": "Pilha do Node: tamanho da pilha usado", + "Node_heap_heap_size_limit": " Pilha do Node: limite de tamanho da pilha", + "Node_heap_malloced_memory": "Pilha do Node: memória alocada", + "Node_heap_peak_malloced_memory": "Pilha do Node: pico de memória alocada", + "Node_heap_does_zap_garbage": "Pilha do Node: elimina o lixo", + "Node_heap_number_of_native_contexts": "Pilha do Node: número de contextos nativos", + "Node_heap_number_of_detached_contexts": "Pilha do Node: número de contextos desanexados", + "Node_memory_usage_rss": "Uso de memória do Node: tamanho do conjunto residente", + "Node_memory_usage_heap_total": "Uso de memória do Node: tamanho total alocado da pilha", + "Node_memory_usage_heap_used": "Uso de memória do Node: memória atual utilizada", + "Node_memory_usage_external": "Uso de memória do Node: externa", + "add-organizations": "Adicionar organizações", + "add-organizations-label": "Organizações adicionadas são exibidas abaixo:", + "remove-organization-from-board": "Você tem certeza que deseja excluir esta organização do quadro?", + "to-create-organizations-contact-admin": "Para criação de organizações, favor entrar em contato com o administrador.", + "custom-legal-notice-link-url": "URL da página de aviso legal customizada", + "acceptance_of_our_legalNotice": "Para continuar, você precisa aceitar nosso", + "legalNotice": "aviso legal", + "copied": "Copiado!" } \ No newline at end of file diff --git a/i18n/pt.i18n.json b/i18n/pt.i18n.json index 7d196c3e1..4baaa3231 100644 --- a/i18n/pt.i18n.json +++ b/i18n/pt.i18n.json @@ -81,7 +81,7 @@ "activity-endDate": "editou a data de fim para %s de %s", "add-attachment": "Adicionar Anexo", "add-board": "Adicionar Quadro", - "add-template": "Add Template", + "add-template": "Adicionar Modelo", "add-card": "Adicionar Cartão", "add-card-to-top-of-list": "Adicionar Cartão no Topo da Lista", "add-card-to-bottom-of-list": "Adicionar Cartão no Fundo da Lista", @@ -96,6 +96,7 @@ "add-members": "Adicionar Membros", "added": "Adicionado", "addMemberPopup-title": "Membros", + "memberPopup-title": "Configuração dos Membros", "admin": "Administrador", "admin-desc": "Pode ver e editar cartões, remover membros e alterar configurações do quadro.", "admin-announcement": "Anúncio", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "E __count__ outros cartões", "apply": "Aplicar", "app-is-offline": "A carregar, por favor aguarde. Actualizar a página causará perda de dados. Se o carregamento não funcionar, por favor verifique se o servidor não parou.", + "app-try-reconnect": "Try to reconnect.", "archive": "Mover para o Arquivo", "archive-all": "Mover Tudo para o Arquivo", "archive-board": "Mover o Quadro para o Arquivo", @@ -159,6 +161,8 @@ "card-delete-notice": "A remoção será permanente. Perderá todas as acções associadas a este cartão.", "card-delete-pop": "Todas as acções serão removidas do feed de atividade e não poderá reabrir o cartão. Não é reversível.", "card-delete-suggest-archive": "Pode mover um cartão para o Arquivo para removê-lo do quadro e preservar a atividade.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "Tu podes restaurar o cartão do arquivo posteriormente.", "card-due": "Data limite", "card-due-on": "Data limite em", "card-spent": "Tempo Gasto", @@ -201,12 +205,13 @@ "poker-unsure": "?", "poker-finish": "Finalizar", "poker-result-votes": "Votos", - "poker-result-who": "Who", + "poker-result-who": "Quem", "poker-replay": "Replay", "set-estimation": "Definir Estimativa", "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Apagar Cartão?", + "cardArchivePopup-title": "Arquivar Cartão?", "cardDetailsActionsPopup-title": "Acções do Cartão", "cardLabelsPopup-title": "Etiquetas", "cardMembersPopup-title": "Membros", @@ -268,14 +273,18 @@ "comment-placeholder": "Escrever o Comentário", "comment-only": "Apenas comentários", "comment-only-desc": "Pode comentar apenas em cartões.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Eliminar comentário?", "no-comments": "Sem comentários", "no-comments-desc": "Não pode ver comentários nem actividades.", "worker": "Trabalhador", "worker-desc": "Apenas pode mover cartões, atribuir-se a si próprio ao cartão e comentar.", "computer": "Computador", "confirm-subtask-delete-dialog": "Tem certeza que deseja apagar a sub-tarefa?", - "confirm-checklist-delete-dialog": "Tem certeza que quer apagar a lista de verificação?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Eliminar lista de verificação?", "copy-card-link-to-clipboard": "Copiar a ligação do cartão para a área de transferência", + "copy-text-to-clipboard": "Copiar texto para a área de transferência", "linkCardPopup-title": "Ligar Cartão", "searchElementPopup-title": "Procurar", "copyCardPopup-title": "Copiar o cartão", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Alterar a data de início", "editCardDueDatePopup-title": "Alterar a data limite", "editCustomFieldPopup-title": "Editar Campo", + "addReactionPopup-title": "Adicionar reação", "editCardSpentTimePopup-title": "Alterar o tempo gasto", "editLabelPopup-title": "Alterar a Etiqueta", "editNotificationPopup-title": "Editar a Notificação", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportar quadro", "exportCardPopup-title": "Exportar cartão", "sort": "Ordenar", + "sorted": "Ordenado", + "remove-sort": "Remover ordenação", "sort-desc": "Clique para ordenar a Lista", "list-sort-by": "Ordenar a Lista por:", "list-label-modifiedAt": "Data do Último Acesso", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Adicionar campo aos novos cartões", "always-field-on-card": "Adicionar campo a todos os cartões", "showLabel-field-on-card": "Mostrar etiqueta do campo no mini-cartão", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Sim", "no": "Não", "accounts": "Contas", "accounts-allowEmailChange": "Permitir Alteração do E-mail", "accounts-allowUserNameChange": "Permitir Alteração de Nome de Utilizador", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Visibilidade do Quadro", "createdAt": "Criado em", "modifiedAt": "Modificado em", "verified": "Verificado", @@ -825,6 +840,7 @@ "error-undefined": "Ocorreu um erro", "error-ldap-login": "Ocorreu um erro ocorreu enquanto tentava entrar", "display-authentication-method": "Mostrar Método de Autenticação", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Método de Autenticação por Omissão", "duplicate-board": "Duplicar Quadro", "org-number": "O número de organizações é:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximizar Cartão", "minimize-card": "Minimizar Cartão", "delete-org-warning-message": "Não pode apagar esta organização, tem no mínimo um utilizador associado", - "delete-team-warning-message": "Não pode apagar esta equipa, tem no mínimo um utilizador associado" + "delete-team-warning-message": "Não pode apagar esta equipa, tem no mínimo um utilizador associado", + "subject": "Assunto", + "details": "Detalhes", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Número do ticket", + "open": "Aberto", + "pending": "Pendente", + "closed": "Fechado", + "resolved": "Resolvido", + "cancelled": "Cancelado", + "history": "Histórico", + "request": "Pedido", + "requests": "Pedidos", + "help-request": "Pedido de ajuda", + "editCardSortOrderPopup-title": "Alterar ordenação", + "cardDetailsPopup-title": "Detalhes do cartão", + "add-teams": "Adicionar equipas", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirmar", + "remove-btn": "Remover", + "filter-card-title-label": "Filtrar por título do cartão", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Nome do domínio do e-mail", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Adicionar organizações", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copiado!" } \ No newline at end of file diff --git a/i18n/ro.i18n.json b/i18n/ro.i18n.json index 76a449c6a..32ce01607 100644 --- a/i18n/ro.i18n.json +++ b/i18n/ro.i18n.json @@ -96,6 +96,7 @@ "add-members": "Adaugă Membrii", "added": "S-a adăugat", "addMemberPopup-title": "Membrii", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Poate vedea și edita carduri, șterge membrii, și schimba setările tablei.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Și __count__ alte carduri", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "card-delete-notice": "Ștergerea este permanentă. Se vor pierde toate acțiunile asociate acestui card.", "card-delete-pop": "Toate acțiunile vor fi șterse din jurnalul de activități si nu vei mai putea redeschide cardul. Nu există recuperare.", "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Caută", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ru.i18n.json b/i18n/ru.i18n.json index 4f79ddb24..febcc194f 100644 --- a/i18n/ru.i18n.json +++ b/i18n/ru.i18n.json @@ -89,13 +89,14 @@ "add-subtask": "Добавить подзадачу", "add-checklist": "Добавить контрольный список", "add-checklist-item": "Добавить пункт в контрольный список", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Преобразовать в Карточку", "add-cover": "Прикрепить", "add-label": "Добавить метку", "add-list": "Добавить простой список", "add-members": "Добавить участника", "added": "Добавлено", "addMemberPopup-title": "Участники", + "memberPopup-title": "Настройки участника", "admin": "Администратор", "admin-desc": "Может просматривать и редактировать карточки, удалять участников и управлять настройками доски.", "admin-announcement": "Объявление", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "И __count__ другие карточки", "apply": "Применить", "app-is-offline": "Идет загрузка, подождите. Обновление страницы приведет к потере данных. Если загрузка не происходит, проверьте работоспособность сервера.", + "app-try-reconnect": "Try to reconnect.", "archive": "Переместить в архив", "archive-all": "Переместить всё в архив", "archive-board": "Переместить доску в архив", @@ -121,8 +123,8 @@ "archives": "Архив", "template": "Шаблон", "templates": "Шаблоны", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "Шаблон Контейнера", + "add-template-container": "Добавить Шаблон Контейнера", "assign-member": "Назначить участника", "attached": "прикреплено", "attachment": "Вложение", @@ -159,6 +161,8 @@ "card-delete-notice": "Это действие невозможно будет отменить. Все изменения, которые вы вносили в карточку будут потеряны.", "card-delete-pop": "Все действия будут удалены из ленты активности участников, и вы не сможете заново открыть карточку. Действие необратимо", "card-delete-suggest-archive": "Вы можете переместить карточку в архив, чтобы убрать ее с доски, сохранив всю историю действий участников.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Выполнить к", "card-due-on": "Выполнить до", "card-spent": "Затраченное время", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Удалить покер планирования?", "poker-delete-pop": "Удаление необратимо. Вы потеряете действия ассоциированные с этим покером планирования.", "cardDeletePopup-title": "Удалить карточку?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Действия в карточке", "cardLabelsPopup-title": "Метки", "cardMembersPopup-title": "Участники", @@ -268,14 +273,18 @@ "comment-placeholder": "Написать комментарий", "comment-only": "Только комментирование", "comment-only-desc": "Может комментировать только карточки.", + "comment-delete": "Вы уверены, что хотите удалить этот комментарий?", + "deleteCommentPopup-title": "Удалить комментарий?", "no-comments": "Без комментариев", "no-comments-desc": "Не видит комментарии и историю действий.", "worker": "Исполнитель", "worker-desc": "Может перемещать карточки, отмечаться как исполнитель и оставлять комментарии", "computer": "Загрузить с компьютера", "confirm-subtask-delete-dialog": "Вы уверены, что хотите удалить подзадачу?", - "confirm-checklist-delete-dialog": "Вы уверены, что хотите удалить контрольный список?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Копировать ссылку на карточку в буфер обмена", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Карточка-ссылка", "searchElementPopup-title": "Поиск", "copyCardPopup-title": "Копировать карточку", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Изменить дату начала", "editCardDueDatePopup-title": "Изменить дату выполнения", "editCustomFieldPopup-title": "Редактировать поле", + "addReactionPopup-title": "Добавить реакцию", "editCardSpentTimePopup-title": "Изменить затраченное время", "editLabelPopup-title": "Изменить метки", "editNotificationPopup-title": "Редактировать уведомления", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Экспортировать доску", "exportCardPopup-title": "Экспорт карточки", "sort": "Сортировать", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Нажмите, чтобы отсортировать список", "list-sort-by": "Сортировать список по:", "list-label-modifiedAt": "Время последнего доступа", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Добавить поле на новую карточку", "always-field-on-card": "Добавить поле на все карточки", "showLabel-field-on-card": "Показать имя поля на карточке", + "showSum-field-on-list": "Показать итоги полей сверху списка", "yes": "Да", "no": "Нет", "accounts": "Учетные записи", "accounts-allowEmailChange": "Разрешить изменение электронной почты", "accounts-allowUserNameChange": "Разрешить изменение имени пользователя", + "tableVisibilityMode-allowPrivateOnly": "Видимость досок: Показывать только частные доски", + "tableVisibilityMode": "Видимость досок", "createdAt": "Создан", "modifiedAt": "Изменено", "verified": "Подтвержден", @@ -825,6 +840,7 @@ "error-undefined": "Что-то пошло не так", "error-ldap-login": "Ошибка при попытке авторизации", "display-authentication-method": "Показывать способ авторизации", + "oidc-button-text": "Изменить текст кнопки OIDC", "default-authentication-method": "Способ авторизации по умолчанию", "duplicate-board": "Клонировать доску", "org-number": "Количество организаций:", @@ -944,7 +960,7 @@ "operator-member": "участника", "operator-member-abbrev": "м", "operator-assignee": "Кому назначено", - "operator-assignee-abbrev": "a", + "operator-assignee-abbrev": "а", "operator-creator": "автор", "operator-status": "статус", "operator-due": "выполнить к", @@ -1059,5 +1075,55 @@ "maximize-card": "Максимизировать карточку", "minimize-card": "Минимизировать карточку", "delete-org-warning-message": "Невозможно удалить эту организацию, она включает в себя как минимум одного пользователя", - "delete-team-warning-message": "Невозможно удалить эту команду, она включает в себя как минимум одного пользователя" + "delete-team-warning-message": "Невозможно удалить эту команду, она включает в себя как минимум одного пользователя", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Удалить", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/sk.i18n.json b/i18n/sk.i18n.json index 1ed21a1ba..20241050a 100644 --- a/i18n/sk.i18n.json +++ b/i18n/sk.i18n.json @@ -96,6 +96,7 @@ "add-members": "Pridať užívateľa", "added": "Predaný", "addMemberPopup-title": "Členovia", + "memberPopup-title": "Member Settings", "admin": "Administrátor", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Oznámenie", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "apply": "Použiť", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Do", "card-due-on": "Do", "card-spent": "Strávený čas", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Zmazať kartu?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Členovia", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximalizovať kartu", "minimize-card": "Minimalizovať kartu", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/sl.i18n.json b/i18n/sl.i18n.json index 0b897b0ea..35de972d5 100644 --- a/i18n/sl.i18n.json +++ b/i18n/sl.i18n.json @@ -96,6 +96,7 @@ "add-members": "Dodaj člane", "added": "Dodano", "addMemberPopup-title": "Člani", + "memberPopup-title": "Nastavitve članov", "admin": "Administrator", "admin-desc": "Lahko gleda in ureja kartice, odstrani člane ter spreminja nastavitve table.", "admin-announcement": "Najava", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "In __count__ drugih kartic", "apply": "Uporabi", "app-is-offline": "Nalaganje, prosimo počakajte. Osveževanje strani bo povzročilo izgubo podatkov. Če nalaganje ne deluje, preverite, ali se strežnik ni ustavil.", + "app-try-reconnect": "Try to reconnect.", "archive": "Premakni v arhiv", "archive-all": "Premakni vse v arhiv", "archive-board": "Arhiviraj tablo", @@ -159,6 +161,8 @@ "card-delete-notice": "Brisanje je trajno. Izgubili boste vsa dejanja, povezana s kartico.", "card-delete-pop": "Vsa dejanja bodo odstranjena iz zgodovine dejavnosti. Kartice ne boste mogli znova odpreti. Razveljavitve ni.", "card-delete-suggest-archive": "Kartico lahko premaknete v arhiv, da jo odstranite s table in ohranite dejavnost.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Rok", "card-due-on": "Rok", "card-spent": "Porabljen čas", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Briši kartico?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Dejanja kartice", "cardLabelsPopup-title": "Oznake", "cardMembersPopup-title": "Člani", @@ -268,14 +273,18 @@ "comment-placeholder": "Napiši komentar", "comment-only": "Samo komentar", "comment-only-desc": "Lahko komentirate samo na karticah.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Ni komentarjev", "no-comments-desc": "Ne morete videti komentarjev in dejavnosti.", "worker": "Delavec", "worker-desc": "Lahko samo premikam kartice, se dodelim na kartico in komentiram.", "computer": "Računalnik", "confirm-subtask-delete-dialog": "Ste prepričani, da želite izbrisati podopravilo?", - "confirm-checklist-delete-dialog": "Ste prepričani, da želite izbrisati kontrolni seznam?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopiraj povezavo kartice na odložišče", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Poveži kartico", "searchElementPopup-title": "Išči", "copyCardPopup-title": "Kopiraj kartico", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Spremeni začetni datum", "editCardDueDatePopup-title": "Spremeni datum zapadlosti", "editCustomFieldPopup-title": "Uredi polje", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Spremeni porabljen čas", "editLabelPopup-title": "Spremeni oznako", "editNotificationPopup-title": "Uredi obvestilo", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Izvozi tablo", "exportCardPopup-title": "Export card", "sort": "Sortiraj", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Klikni za sortiranje seznama", "list-sort-by": "Sortiraj po:", "list-label-modifiedAt": "Nazadnje dostopano", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Add field to new cards", "always-field-on-card": "Add field to all cards", "showLabel-field-on-card": "Prikaži oznako polja na mini kartici", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Da", "no": "Ne", "accounts": "Up. računi", "accounts-allowEmailChange": "Dovoli spremembo e-poštnega naslova", "accounts-allowUserNameChange": "Dovoli spremembo up. imena", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Ustvarjen ob", "modifiedAt": "Modified at", "verified": "Preverjeno", @@ -825,6 +840,7 @@ "error-undefined": "Prišlo je do napake", "error-ldap-login": "Prišlo je do napake ob prijavi", "display-authentication-method": "Prikaži metodo avtentikacije", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Privzeta metoda avtentikacije", "duplicate-board": "Dupliciraj tablo", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Odstrani", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/sr.i18n.json b/i18n/sr.i18n.json index 6aa812da5..935a85651 100644 --- a/i18n/sr.i18n.json +++ b/i18n/sr.i18n.json @@ -96,6 +96,7 @@ "add-members": "Dodaj članove", "added": "Dodao", "addMemberPopup-title": "Članovi", + "memberPopup-title": "Member Settings", "admin": "Administrator", "admin-desc": "Može da pregleda i menja kartice, uklanja članove i menja podešavanja table", "admin-announcement": "Najava", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "And __count__ other cards", "apply": "Primeni", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Premesti u arhivu", "archive-all": "Premesti sve u arhivu", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "card-delete-notice": "Brisanje je trajno. Izgubićeš sve akcije povezane sa ovom karticom.", "card-delete-pop": "Sve akcije će biti uklonjene sa liste aktivnosti i kartica neće moći biti ponovo otvorena. Nema vraćanja unazad.", "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Rok", "card-due-on": "Završava se", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Obrisati karticu?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Oznake", "cardMembersPopup-title": "Članovi", @@ -268,14 +273,18 @@ "comment-placeholder": "Napiši komentar", "comment-only": "Samo komentari", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "No comments", "no-comments-desc": "Can not see comments and activities.", "worker": "Radnik", "worker-desc": "Može samo da pomera kartice, dodeljuje sebe kartici i da komentariše. ", "computer": "Računar", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Poveži karticu", "searchElementPopup-title": "Pretraga", "copyCardPopup-title": "Kopiraj karticu", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Izmeni početni datum", "editCardDueDatePopup-title": "Izmeni krajnji datum", "editCustomFieldPopup-title": "Izmeni polje", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Izmeni oznaku", "editNotificationPopup-title": "Izmeni obaveštenje", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sortiraj", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Kliknite da biste sortirali listu", "list-sort-by": "Poredaj listu po:", "list-label-modifiedAt": "Poslednje vreme pristupa", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Da", "no": "Ne", "accounts": "Nalozi", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Ukloni", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/sv.i18n.json b/i18n/sv.i18n.json index adfc18f87..3635dc903 100644 --- a/i18n/sv.i18n.json +++ b/i18n/sv.i18n.json @@ -96,6 +96,7 @@ "add-members": "Lägg till medlemmar", "added": "Lades till", "addMemberPopup-title": "Medlemmar", + "memberPopup-title": "Användarinställningar", "admin": "Adminstratör", "admin-desc": "Kan visa och redigera kort, ta bort medlemmar och ändra inställningarna för tavlan.", "admin-announcement": "Meddelande", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Och __count__ andra kort", "apply": "Tillämpa", "app-is-offline": "Läser in, vänligen vänta. Uppdatering av sidan kommer att orsaka förlust av data. Om inläsningen inte fungerar, kontrollera att servern inte har stoppats.", + "app-try-reconnect": "Try to reconnect.", "archive": "Flytta till Arkiv", "archive-all": "Flytta Alla till Arkiv", "archive-board": "Flytta Tavla till Arkiv", @@ -159,6 +161,8 @@ "card-delete-notice": "Radering är permanent. Du kommer att förlora alla händelser kopplade till detta kort.", "card-delete-pop": "Alla händelser kommer att tas bort från aktivitetsflödet och du kommer inte att kunna öppna kortet igen. Det går inte att ångra.", "card-delete-suggest-archive": "Du kan flytta ett kort till Arkiv för att ta bort det från tavlan och bevara aktiviteten.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Förfaller", "card-due-on": "Förfaller på", "card-spent": "Spenderad tid", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Radera kort?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Korthändelser", "cardLabelsPopup-title": "Etiketter", "cardMembersPopup-title": "Medlemmar", @@ -268,14 +273,18 @@ "comment-placeholder": "Skriv kommentar", "comment-only": "Kommentera endast", "comment-only-desc": "Kan endast kommentera kort.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Inga kommentarer", "no-comments-desc": "Kan inte se kommentarer och aktiviteter.", "worker": "Worker", "worker-desc": "Kan endast flytta kort, tilldela sig själv till kort och kommentera.", "computer": "Dator", "confirm-subtask-delete-dialog": "Är du säker på att du vill radera deluppgift?", - "confirm-checklist-delete-dialog": "Är du säker på att du vill radera checklista?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kopiera kortlänk till urklipp", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Länka kort", "searchElementPopup-title": "Sök", "copyCardPopup-title": "Kopiera kort", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Ändra startdatum", "editCardDueDatePopup-title": "Ändra förfallodatum", "editCustomFieldPopup-title": "Redigera fält", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Ändra spenderad tid", "editLabelPopup-title": "Ändra etikett", "editNotificationPopup-title": "Redigera notis", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Exportera tavla", "exportCardPopup-title": "Export card", "sort": "Sortera", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Klicka för att sortera listan", "list-sort-by": "Sortera listan efter:", "list-label-modifiedAt": "Sista åtkomsttid", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Lägg till fält till nytt kort", "always-field-on-card": "Lägg till fält till alla kort", "showLabel-field-on-card": "Visa fältetikett på minikort", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Ja", "no": "Nej", "accounts": "Konton", "accounts-allowEmailChange": "Tillåt e-poständring", "accounts-allowUserNameChange": "Tillåt användarnamnändring", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Skapad vid", "modifiedAt": "Senast ändrad", "verified": "Verifierad", @@ -825,6 +840,7 @@ "error-undefined": "Något gick fel", "error-ldap-login": "Ett fel uppstod när du försökte logga in", "display-authentication-method": "Visa autentiseringsmetod", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Standard autentiseringsmetod", "duplicate-board": "Duplicera tavla", "org-number": "Antalet organisationer är:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Ta bort", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/sw.i18n.json b/i18n/sw.i18n.json index 194b58ed3..a5d12abfa 100644 --- a/i18n/sw.i18n.json +++ b/i18n/sw.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Muda uliotumika", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Andika changio", "comment-only": "Changia pekee", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "Tarakilishi", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/ta.i18n.json b/i18n/ta.i18n.json index c3b817a63..cd6982bd3 100644 --- a/i18n/ta.i18n.json +++ b/i18n/ta.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "கருத்து மட்டும் ", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "கணினி ", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "தேடு ", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/th.i18n.json b/i18n/th.i18n.json index 51ed9b3c3..3aa442648 100644 --- a/i18n/th.i18n.json +++ b/i18n/th.i18n.json @@ -96,6 +96,7 @@ "add-members": "เพิ่มสมาชิก", "added": "เพิ่ม", "addMemberPopup-title": "สมาชิก", + "memberPopup-title": "การตั้งค่า", "admin": "ผู้ดูแลระบบ", "admin-desc": "สามารถดูและแก้ไขการ์ด ลบสมาชิก และเปลี่ยนการตั้งค่าบอร์ดได้", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "และการ์ดอื่น ๆ __count__", "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "card-delete-notice": "เป็นการลบถาวร คุณจะสูญเสียข้อมูลที่เกี่ยวข้องกับการ์ดนี้ทั้งหมด", "card-delete-pop": "การดำเนินการทั้งหมดจะถูกลบจาก feed กิจกรรมและคุณไม่สามารถเปิดได้อีกครั้งหรือยกเลิกการทำ", "card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "ครบกำหนด", "card-due-on": "ครบกำหนดเมื่อ", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "ลบการ์ดนี้หรือไม่", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "การดำเนินการการ์ด", "cardLabelsPopup-title": "ป้ายกำกับ", "cardMembersPopup-title": "สมาชิก", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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": "คอมพิวเตอร์", "confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?", - "confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "ค้นหา", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "เปลี่ยนวันเริ่มต้น", "editCardDueDatePopup-title": "เปลี่ยนวันครบกำหนด", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "เปลี่ยนป้ายกำกับ", "editNotificationPopup-title": "แก้ไขการแจ้งเตือน", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "ส่งออกกระดาน", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/tr.i18n.json b/i18n/tr.i18n.json index b9c529155..7e2f70b28 100644 --- a/i18n/tr.i18n.json +++ b/i18n/tr.i18n.json @@ -3,15 +3,15 @@ "act-activity-notify": "Etkinlik Bildirimi", "act-addAttachment": "__attachment__ eklentisi, __swimlane__ kulvarındaki __list__ listesindeki __board__ panosundaki __card__ kartına eklendi.", "act-deleteAttachment": "__attachment__ eklentisi, __swimlane__ kulvarındaki __list__ listesindeki __board__ panosundaki __card__ kartından silindi.", - "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-addSubtask": "__board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartına __subtask__ alt görevi eklendi", + "act-addLabel": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartına __label__ etiketi eklendi", + "act-addedLabel": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartına __label__ etiketi eklendi", + "act-removeLabel": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartından __label__ etiketi silindi", + "act-removedLabel": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartından __label__ etiketi silindi", + "act-addChecklist": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartına __checklist__ kontrol listesi eklendi", + "act-addChecklistItem": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartının, __checklist__ kontrol listesine __checklistitem__ kontrol listesi elemanı eklendi", + "act-removeChecklist": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartından __checklist__ kontrol listesi silindi", + "act-removeChecklistItem": " __board__ tahtasının, __swimlane__ kulvarının, __list__ listesindeki __card__ kartının, __checklist__ kontrol listesinden __checklistitem__ kontrol listesi elemanı silindi", "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__", @@ -81,21 +81,22 @@ "activity-endDate": "edited end date to %s of %s", "add-attachment": "Ek Ekle", "add-board": "Pano Ekle", - "add-template": "Add Template", + "add-template": "Şablon ekle", "add-card": "Kart Ekle", - "add-card-to-top-of-list": "Add Card to Top of List", - "add-card-to-bottom-of-list": "Add Card to Bottom of List", + "add-card-to-top-of-list": "Listenin Başına Kart Ekle", + "add-card-to-bottom-of-list": "Listenin Sonuna Kart Ekle", "add-swimlane": "Kulvar Ekle", "add-subtask": "Alt Görev Ekle", "add-checklist": "Yapılacak Listesi Ekle", "add-checklist-item": "Yapılacak listesine yeni bir öğe ekle", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "Karta Çevir", "add-cover": "Kapak resmi ekle", "add-label": "Etiket Ekle", "add-list": "Liste Ekle", "add-members": "Üye ekle", "added": "Eklendi", "addMemberPopup-title": "Üyeler", + "memberPopup-title": "Üye Ayarları", "admin": "Yönetici", "admin-desc": "Kartları görüntüleyebilir ve düzenleyebilir, üyeleri çıkarabilir ve pano ayarlarını değiştirebilir.", "admin-announcement": "Duyuru", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Ve __count__ diğer kart", "apply": "Uygula", "app-is-offline": "Yükleniyor lütfen bekleyin. Sayfayı yenilemek veri kaybına neden olur. Yükleme çalışmıyorsa, lütfen sunucunun durmadığını kontrol edin.", + "app-try-reconnect": "Try to reconnect.", "archive": "Arşive Taşı", "archive-all": "Hepsini Arşive Taşı", "archive-board": "Panoyu Arşive Taşı", @@ -121,8 +123,8 @@ "archives": "Arşivle", "template": "Şablon", "templates": "Şablonlar", - "template-container": "Template Container", - "add-template-container": "Add Template Container", + "template-container": "Şablon Konteyner", + "add-template-container": "Şablon Konteyner Ekle", "assign-member": "Üye ata", "attached": "dosya(sı) eklendi", "attachment": "Ek Dosya", @@ -130,14 +132,14 @@ "attachmentDeletePopup-title": "Ek Silinsin mi?", "attachments": "Ekler", "auto-watch": "Oluşan yeni panoları kendiliğinden izlemeye al", - "avatar-too-big": "The avatar is too large (520KB max)", + "avatar-too-big": "Avatar boyutu çok büyük (maksimum 520KB)", "back": "Geri", "board-change-color": "Renk değiştir", "board-nb-stars": "%s yıldız", "board-not-found": "Pano bulunamadı", "board-private-info": "Bu pano <strong>gizli</strong> olacak.", "board-public-info": "Bu pano <strong>genel</strong>e açılacaktır.", - "board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.", + "board-drag-drop-reorder-or-click-open": "Tahta ikonlarını yeniden sıralamak için sürükleyip bırakın. Tahtayı açmak için tahta ikonuna tıklayın.", "boardChangeColorPopup-title": "Pano arkaplan rengini değiştir", "boardChangeTitlePopup-title": "Panonun Adını Değiştir", "boardChangeVisibilityPopup-title": "Görünebilirliği Değiştir", @@ -159,6 +161,8 @@ "card-delete-notice": "Silme işlemi kalıcıdır. Bu kartla ilişkili tüm eylemleri kaybedersiniz.", "card-delete-pop": "Son hareketler alanındaki tüm veriler silinecek, ayrıca bu kartı yeniden açamayacaksın. Bu işlemin geri dönüşü yok.", "card-delete-suggest-archive": "Bir kartı tahtadan çıkarmak ve etkinliği korumak için Arşive taşıyabilirsiniz.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Bitiş", "card-due-on": "Bitiş tarihi:", "card-spent": "Harcanan Zaman", @@ -185,10 +189,10 @@ "vote-against": "red", "deleteVotePopup-title": "Seçim silinsin mi?", "vote-delete-pop": "Silme kalıcı bir işlemdir. Bu seçimle ilgili tüm eylemleri yitireceksiniz.", - "cardStartPlanningPokerPopup-title": "Start a Planning Poker", - "card-edit-planning-poker": "Edit Planning Poker", - "editPokerEndDatePopup-title": "Change Planning Poker vote end date", - "poker-question": "Planning Poker", + "cardStartPlanningPokerPopup-title": "Poker Planlamaya Başla", + "card-edit-planning-poker": "Poker Planlamasını Düzenle", + "editPokerEndDatePopup-title": "Poker Planlamanın son oylama tarihini değiştir", + "poker-question": "Poker Planlama", "poker-one": "1", "poker-two": "2", "poker-three": "3", @@ -199,14 +203,15 @@ "poker-forty": "40", "poker-oneHundred": "100", "poker-unsure": "?", - "poker-finish": "Finish", - "poker-result-votes": "Votes", - "poker-result-who": "Who", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", - "deletePokerPopup-title": "Delete planning poker?", - "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", + "poker-finish": "Bitir", + "poker-result-votes": "Oylar", + "poker-result-who": "Kim", + "poker-replay": "Tekrar Oynat", + "set-estimation": "Tahmini Değer Ata", + "deletePokerPopup-title": "Poker planlamayı sil?", + "poker-delete-pop": "Silme işlemi kalıcıdır. Bu poker planlama ile ilgili tüm hareketleri kaybedeceksiniz.", "cardDeletePopup-title": "Kart Silinsin mi?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Kart işlemleri", "cardLabelsPopup-title": "Etiketler", "cardMembersPopup-title": "Üyeler", @@ -236,8 +241,8 @@ "clipboard": "Yapıştır veya sürükleyip bırak", "close": "Kapat", "close-board": "Panoyu kapat", - "close-board-pop": "\n92/5000\nAna başlıktaki “Arşiv” düğmesine tıklayarak tahtayı geri yükleyebilirsiniz.", - "close-card": "Close Card", + "close-board-pop": "Ana başlıktaki “Arşiv” düğmesine tıklayarak tahtayı geri yükleyebilirsiniz.", + "close-card": "Kartı Kapat", "color-black": "siyah", "color-blue": "mavi", "color-crimson": "kızıl", @@ -268,14 +273,18 @@ "comment-placeholder": "Yorum Yaz", "comment-only": "Sadece yorum", "comment-only-desc": "Sadece kartlara yorum yazabilir.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Yorum Yok", "no-comments-desc": "Yorumlar ve aktiviteleri göremiyorum.", "worker": "Çalışan", "worker-desc": "Yalnızca kartları taşıyabilir, kendisini karta atayabilir ve yorum yapabilir.", "computer": "Bilgisayar", "confirm-subtask-delete-dialog": "Alt görevi silmek istediğinizden emin misiniz?", - "confirm-checklist-delete-dialog": "Kontrol listesini silmek istediğinden emin misin?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Kartın linkini kopyala", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Bağlantı kartı", "searchElementPopup-title": "Arama", "copyCardPopup-title": "Kartı Kopyala", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Başlangıç tarihini değiştir", "editCardDueDatePopup-title": "Bitiş tarihini değiştir", "editCustomFieldPopup-title": "Alanı düzenle", + "addReactionPopup-title": "Reaksiyon ekle", "editCardSpentTimePopup-title": "Harcanan zamanı değiştir", "editLabelPopup-title": "Etiket Değiştir", "editNotificationPopup-title": "Bildirimi değiştir", @@ -352,22 +362,24 @@ "error-user-notAllowSelf": "Kendi kendini davet edemezsin", "error-user-notCreated": "Bu üye oluşturulmadı", "error-username-taken": "Kullanıcı adı zaten alınmış", - "error-orgname-taken": "This organization name is already taken", - "error-teamname-taken": "This team name is already taken", + "error-orgname-taken": "Organizasyon ismi daha önce alınmış", + "error-teamname-taken": "Takım ismi daha önce alınmış", "error-email-taken": "Bu e-posta adresi daha önceden alınmış", "export-board": "Panoyu dışarı aktar", "export-board-json": "Panoyu JSON olarak dışarı aktar", "export-board-csv": "Panoyu CSV olarak dışarı aktar", "export-board-tsv": "Panoyu TSV olarak dışarı aktar", - "export-board-excel": "Export board to Excel", - "user-can-not-export-excel": "User can not export Excel", + "export-board-excel": "Tahtayı Excel olarak dışa aktar", + "user-can-not-export-excel": "Bu kullanıcı Excel olarak dışa aktaramaz.", "export-board-html": "Panoyu HTML olarak dışarı aktar", - "export-card": "Export card", - "export-card-pdf": "Export card to PDF", - "user-can-not-export-card-to-pdf": "User can not export card to PDF", + "export-card": "Kartı dışa aktar", + "export-card-pdf": "Kartı PDF olarak dışa aktar", + "user-can-not-export-card-to-pdf": "Bu kullanıcı kartı PDF olarak dışa aktaramaz.", "exportBoardPopup-title": "Panoyu dışarı aktar", - "exportCardPopup-title": "Export card", + "exportCardPopup-title": "Kartı dışa aktar.", "sort": "Sırala", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Listeyi Sıralamak için Tıklayın", "list-sort-by": "Listeyi Sırala:", "list-label-modifiedAt": "Son Erişim Zamanı...", @@ -378,12 +390,12 @@ "list-label-short-sort": "(M)", "filter": "Filtre", "filter-cards": "Kartları veya Listeleri Filtrele", - "filter-dates-label": "Filter by date", - "filter-no-due-date": "No due date", - "filter-overdue": "Overdue", - "filter-due-today": "Due today", - "filter-due-this-week": "Due this week", - "filter-due-tomorrow": "Due tomorrow", + "filter-dates-label": "Tarihe göre filtrele", + "filter-no-due-date": "Son tarih yok", + "filter-overdue": "Son tarihi geçmiş", + "filter-due-today": "Son tarihi bügün", + "filter-due-this-week": "Son tarihi bu hafta", + "filter-due-tomorrow": "Son tarihi yarın", "list-filter-label": "Listeyi Başlığa Göre Filtrele", "filter-clear": "Filtreyi temizle", "filter-labels-label": "Etikete göre filtrele", @@ -455,8 +467,8 @@ "set-color-list": "Rengi Ayarla", "listActionPopup-title": "Liste İşlemleri", "settingsUserPopup-title": "Kullanıcı Ayarları", - "settingsTeamPopup-title": "Team Settings", - "settingsOrgPopup-title": "Organization Settings", + "settingsTeamPopup-title": "Takım Ayarları", + "settingsOrgPopup-title": "Organizasyon Ayarları", "swimlaneActionPopup-title": "Kulvar İşlemleri", "swimlaneAddPopup-title": "Aşağı kulvar ekle", "listImportCardPopup-title": "Bir Trello kartını içeri aktar", @@ -576,7 +588,7 @@ "text-below-custom-login-logo": "Özel Oturum Açma Logosunun altındaki metin", "automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line", "username": "Kullanıcı adı", - "import-usernames": "Import Usernames", + "import-usernames": "Kullanıcıisimlerini içe aktar", "view-it": "Görüntüle", "warn-list-archived": "Uyarı: Bu kart arşivdeki bir listede", "watch": "Takip Et", @@ -648,16 +660,19 @@ "minutes": "dakika", "seconds": "saniye", "show-field-on-card": "Bu alanı kartta göster", - "automatically-field-on-card": "Add field to new cards", - "always-field-on-card": "Add field to all cards", + "automatically-field-on-card": "Yeni kartlara alan ekle", + "always-field-on-card": "Tüm kartlara alan ekle", "showLabel-field-on-card": "Minikard üzerindeki alan etiketini göster", + "showSum-field-on-list": "Toplan alan sayısını listenin üstünde göster", "yes": "Evet", "no": "Hayır", "accounts": "Hesaplar", "accounts-allowEmailChange": "E-posta Değiştirmeye İzin Ver", "accounts-allowUserNameChange": "Kullanıcı adı değiştirmeye izin ver", + "tableVisibilityMode-allowPrivateOnly": "Tahta Görünürlüğü: Sadece özel tahtalara izin ver", + "tableVisibilityMode": "Tahta Görünürlüğü", "createdAt": "Oluşturulma tarihi", - "modifiedAt": "Modified at", + "modifiedAt": "Değiştirilme zamanı", "verified": "Doğrulanmış", "active": "Aktif", "card-received": "Giriş", @@ -672,7 +687,7 @@ "setListColorPopup-title": "Renk seçimi yap", "assigned-by": "Atamayı yapan", "requested-by": "Talep Eden", - "card-sorting-by-number": "Card sorting by number", + "card-sorting-by-number": "Kartları sayıya göre sırala", "board-delete-notice": "Silme kalıcıdır. Bu kartla ilişkili tüm listeleri, kartları ve işlemleri kaybedeceksiniz.", "delete-board-confirm-popup": "Tüm listeler, kartlar, etiketler ve etkinlikler silinecek ve pano içeriğini kurtaramayacaksınız. Geri dönüş yok.", "boardDeletePopup-title": "Panoyu Sil?", @@ -825,10 +840,11 @@ "error-undefined": "Bir şeyler yanlış gitti", "error-ldap-login": "Giriş yapmaya çalışırken bir hata oluştu", "display-authentication-method": "Kimlik Doğrulama Yöntemini Görüntüle", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Varsayılan Kimlik Doğrulama Yöntemi", "duplicate-board": "Panoyu Çoğalt", - "org-number": "The number of organizations is:", - "team-number": "The number of teams is:", + "org-number": "Organizasyon sayısı:", + "team-number": "Takım sayısı:", "people-number": "Kişi sayısı:", "swimlaneDeletePopup-title": "Kulvar silinsin mi?", "swimlane-delete-pop": "Tüm eylemler etkinlik akışından kaldırılacak ve kulvarınızı kurtaramayacaksınız. Geri alınamaz.", @@ -897,14 +913,14 @@ "hide-checked-items": "İşaretli öğeleri gizle", "task": "Görev", "create-task": "Görev Oluştur", - "ok": "OK", + "ok": "Tamam", "organizations": "Organizasyonlar", "teams": "Takımlar", "displayName": "Görünen İsim", - "shortName": "Short Name", + "shortName": "Kısa ad", "website": "Web Site", "person": "Kişi", - "my-cards": "My Cards", + "my-cards": "Kartlarım", "card": "Kart", "board": "Pano", "context-separator": "/", @@ -926,65 +942,65 @@ "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", + "globalSearch-title": "Tüm Tahtaları Ara", + "no-cards-found": "Kart Bulunamadı", + "one-card-found": "Bir Kart Bulundu", + "n-cards-found": "%s Kart Bulundu", "n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found", - "operator-board": "board", + "operator-board": "tahta", "operator-board-abbrev": "b", - "operator-swimlane": "swimlane", + "operator-swimlane": "kulvar", "operator-swimlane-abbrev": "s", "operator-list": "liste", "operator-list-abbrev": "l", "operator-label": "etiket", "operator-label-abbrev": "#", - "operator-user": "user", + "operator-user": "kullanıcı", "operator-user-abbrev": "@", "operator-member": "üye", "operator-member-abbrev": "m", - "operator-assignee": "assignee", + "operator-assignee": "görevli", "operator-assignee-abbrev": "a", - "operator-creator": "creator", - "operator-status": "status", + "operator-creator": "oluşturan", + "operator-status": "durum", "operator-due": "vade", - "operator-created": "created", - "operator-modified": "modified", - "operator-sort": "sort", - "operator-comment": "comment", + "operator-created": "oluşturuldu", + "operator-modified": "değiştirildi", + "operator-sort": "sırala", + "operator-comment": "yorum", "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-archived": "arşivlendi", + "predicate-open": "açık", + "predicate-ended": "sonlandı", + "predicate-all": "tüm", + "predicate-overdue": "vakti geçmiş", + "predicate-week": "hafta", + "predicate-month": "ay", + "predicate-quarter": "çeyrek", + "predicate-year": "yıl", "predicate-due": "vade", - "predicate-modified": "modified", - "predicate-created": "created", - "predicate-attachment": "attachment", - "predicate-description": "description", + "predicate-modified": "değiştirildi", + "predicate-created": "oluşturuldu", + "predicate-attachment": "ek", + "predicate-description": "tanım", "predicate-checklist": "Kontrol Listesi", "predicate-start": "başlangıç", "predicate-end": "bitiş", - "predicate-assignee": "assignee", + "predicate-assignee": "görevli", "predicate-member": "üye", - "predicate-public": "public", - "predicate-private": "private", - "operator-unknown-error": "%s is not an operator", + "predicate-public": "açık", + "predicate-private": "özel", + "operator-unknown-error": "%soperator değil", "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", + "next-page": "Sonraki sayfa", + "previous-page": "Önceki Sayfa", + "heading-notes": "Notlar", + "globalSearch-instructions-heading": "Arama Talimatları", "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>*", @@ -1014,27 +1030,27 @@ "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", + "globalSearch-instructions-notes-4": "Text aramalarında büyük/küçük harf duyarlılığı yok", + "globalSearch-instructions-notes-5": "Temel aramada arşivlenmiş kartlar aranmaz", + "link-to-search": "Bu aramaya link", "excel-font": "Arial", "number": "Sayı", - "label-colors": "Label Colors", - "label-names": "Label Names", - "archived-at": "archived at", - "sort-cards": "Sort Cards", - "cardsSortPopup-title": "Sort Cards", - "due-date": "Due Date", + "label-colors": "Etiket Renkleri", + "label-names": "Etiket İsimleri", + "archived-at": "Şurada arşivlendi", + "sort-cards": "Kartları Sırala", + "cardsSortPopup-title": "Kartları Sırala", + "due-date": "Bitiş Tarihi", "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", + "title-alphabetically": "Başlık(Alfabetik)", + "created-at-newest-first": "Oluşturulma Tarihi(En Yenisi ilk)", + "created-at-oldest-first": "Oluşturulma Tarihi(En Eskisi İlk)", + "links-heading": "Linkler", + "hide-system-messages-of-all-users": "Tüm kullanıcıların sistem mesajlarını gizle", + "now-system-messages-of-all-users-are-hidden": "Tüm kullanıcıların sistem mesajları gizlendi", + "move-swimlane": "Kulvarı Taşı", + "moveSwimlanePopup-title": "Kulvarı Taşı", "custom-field-stringtemplate": "String Template", "custom-field-stringtemplate-format": "Format (use %{value} as placeholder)", "custom-field-stringtemplate-separator": "Separator (use or   for a space)", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Kaldır", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/uk.i18n.json b/i18n/uk.i18n.json index 8e3ac4384..ac0a008d0 100644 --- a/i18n/uk.i18n.json +++ b/i18n/uk.i18n.json @@ -96,6 +96,7 @@ "add-members": "Додати користувача", "added": "Доданно", "addMemberPopup-title": "Користувачі", + "memberPopup-title": "Member Settings", "admin": "Адмін", "admin-desc": "Може переглядати і редагувати картки, відаляти учасників та змінювати налаштування для дошки.", "admin-announcement": "Оголошення", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "та __count__ інших карток", "apply": "Прийняти", "app-is-offline": "Завантаження, будь ласка, зачекайте. Оновлення сторінки призведе до втрати даних. Якщо завантаження не працює, перевірте, чи не зупинився сервер.", + "app-try-reconnect": "Try to reconnect.", "archive": "Перенести до Архіву", "archive-all": "Перенести Все до Архіву", "archive-board": "Перенести Дошку до Архіву", @@ -159,6 +161,8 @@ "card-delete-notice": "Цю дію неможливо буде скасувати. Всі зміни, які ви вносили в картку будуть втрачені.", "card-delete-pop": "Усі дії буде видалено з каналу активності, і ви не зможете повторно відкрити картку. Цю дію не можна скасувати.", "card-delete-suggest-archive": "Ви можете перемістити картку до архіву, щоб прибрати її з дошки, зберігаючи всю історію дій учасників.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Витрачено часу", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Видалити картку?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Користувачі", @@ -268,14 +273,18 @@ "comment-placeholder": "Написати коментар", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Скопіювати посилання на картку в буфер обміну", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Шукати", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Дозволити Зміну Email", "accounts-allowUserNameChange": "Дозволити Зміну Імені Користувача", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Створено", "modifiedAt": "Modified at", "verified": "Перевірено", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Видалити\n", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/vi.i18n.json b/i18n/vi.i18n.json index 7a36910df..1eb9bc54a 100644 --- a/i18n/vi.i18n.json +++ b/i18n/vi.i18n.json @@ -96,6 +96,7 @@ "add-members": "Thêm Thành Viên", "added": "Đã Thêm", "addMemberPopup-title": "Thành Viên", + "memberPopup-title": "Cài đặt thành viên", "admin": "Quản Trị Viên", "admin-desc": "Có thể xem và chỉnh sửa những thẻ, xóa thành viên và thay đổi cài đặt cho bảng.", "admin-announcement": "Thông báo", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "Và __count__ thẻ khác", "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ủ.", + "app-try-reconnect": "Try to reconnect.", "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ữ", @@ -159,6 +161,8 @@ "card-delete-notice": "Hành động xóa là không thể khôi phục. Bạn sẽ mất hết các hoạt động liên quan đến thẻ này.", "card-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ể mở lại thẻ. Không có hoàn tác.", "card-delete-suggest-archive": "Bạn có thể di chuyển một thẻ vào Lưu trữ để xóa thẻ đó khỏi bảng và duy trì hoạt động này.", + "card-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Đến hạn", "card-due-on": "Đến hạn vào", "card-spent": "Thời lượng", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Xoá Thẻ", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Hành động thẻ", "cardLabelsPopup-title": "Nhãn", "cardMembersPopup-title": "Thành Viên", @@ -268,14 +273,18 @@ "comment-placeholder": "Viết Bình Luận", "comment-only": "Chỉ bình luận", "comment-only-desc": "Chỉ có thể nhận xét về thẻ.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "Không có bình luận", "no-comments-desc": "Không thể xem bình luận và hoạt động.", "worker": "Worker", "worker-desc": "Chỉ có thể di chuyển thẻ, tự gán thẻ và nhận xét.", "computer": "Máy tính", "confirm-subtask-delete-dialog": "Bạn có chắc chắn muốn xóa nhiệm vụ phụ không?", - "confirm-checklist-delete-dialog": "Bạn có chắc chắn muốn xóa checklist không?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Sao chép liên kết thẻ vào khay nhớ tạm", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Thẻ liên kết", "searchElementPopup-title": "Tìm kiếm", "copyCardPopup-title": "Sao chép Thẻ", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Thay đổi ngày bắt đầu", "editCardDueDatePopup-title": "Thay đổi ngày đến hạn", "editCustomFieldPopup-title": "Sửa Trường", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Thay đổi thời gian đã sử dụng", "editLabelPopup-title": "Thay đổi nhãn", "editNotificationPopup-title": "Sửa Thông báo", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Xuất bảng", "exportCardPopup-title": "Export card", "sort": "Sắp xếp", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Nhấp để sắp xếp danh sách", "list-sort-by": "Sắp xếp Danh sách bởi:", "list-label-modifiedAt": "Lần truy cập cuối cùng", @@ -651,11 +663,14 @@ "automatically-field-on-card": "Thêm trường vào thẻ mới", "always-field-on-card": "Thêm trường vào tất cả các thẻ", "showLabel-field-on-card": "Hiển thị nhãn trường trên minicard", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Có", "no": "Không", "accounts": "Tài khoản", "accounts-allowEmailChange": "Cho phép thay đổi email", "accounts-allowUserNameChange": "Cho phép thay đổi tên người dùng", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Được tạo lúc", "modifiedAt": "Được sửa đổi lúc", "verified": "Đã xác minh", @@ -825,6 +840,7 @@ "error-undefined": "Đã xảy ra sự cố", "error-ldap-login": "Đã xảy ra lỗi khi cố gắng đăng nhập", "display-authentication-method": "Hiển thị phương pháp xác thực", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Phương thức xác thực mặc định", "duplicate-board": "Bảng trùng lặp", "org-number": "Số lượng các tổ chức là:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Xóa", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/zh-CN.i18n.json b/i18n/zh-CN.i18n.json index ca3f39b96..46c3fc4cb 100644 --- a/i18n/zh-CN.i18n.json +++ b/i18n/zh-CN.i18n.json @@ -1,5 +1,5 @@ { - "accept": "接受", + "accept": "同意", "act-activity-notify": "活动通知", "act-addAttachment": "添加附件 __attachment__ 到看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中", "act-deleteAttachment": "删除看板 __board__ 中的泳道 __swimlane__ 中的列表 __list__ 中的卡片 __card__ 中的附件 __attachment__", @@ -42,7 +42,7 @@ "act-unjoinMember": "移除成员 __member__ 从卡片 __card__ 列表 __list__ a泳道 __swimlane__ 看板 __board__", "act-withBoardTitle": "看板__board__", "act-withCardTitle": "[看板 __board__] 卡片 __card__", - "actions": "操作", + "actions": "动作", "activities": "活动", "activity": "活动", "activity-added": "添加 %s 至 %s", @@ -81,21 +81,22 @@ "activity-endDate": "已将结束日期从 %s 修改为 %s", "add-attachment": "添加附件", "add-board": "添加看板", - "add-template": "新增模板", + "add-template": "添加模板", "add-card": "添加卡片", - "add-card-to-top-of-list": "新增卡片到列表顶部", - "add-card-to-bottom-of-list": "新增卡片到列表底部", + "add-card-to-top-of-list": "添加卡片到列表顶部", + "add-card-to-bottom-of-list": "添加卡片到列表底部", "add-swimlane": "添加泳道图", "add-subtask": "添加子任务", - "add-checklist": "添加待办清单", - "add-checklist-item": "扩充清单", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "add-checklist": "添加清单", + "add-checklist-item": "添加项目清单", + "convertChecklistItemToCardPopup-title": "转为卡片", "add-cover": "添加封面", "add-label": "添加标签", "add-list": "添加列表", "add-members": "添加成员", "added": "添加", "addMemberPopup-title": "成员", + "memberPopup-title": "成员设置", "admin": "管理员", "admin-desc": "可以浏览并编辑卡片,移除成员,并且更改该看板的设置", "admin-announcement": "通知", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "和其他 __count__ 个卡片", "apply": "应用", "app-is-offline": "加载中,请稍后。刷新页面将导致数据丢失,如果加载长时间不起作用,请检查服务器是否已经停止工作。", + "app-try-reconnect": "尝试重新建立连接。", "archive": "归档", "archive-all": "全部归档", "archive-board": "将看板归档", @@ -149,7 +151,7 @@ "board-view-cal": "日历", "board-view-swimlanes": "泳道图", "board-view-collapse": "崩溃", - "board-view-gantt": "甘特", + "board-view-gantt": "甘特图", "board-view-lists": "列表", "bucket-example": "例如 “目标清单”", "cancel": "取消", @@ -159,6 +161,8 @@ "card-delete-notice": "彻底删除的操作不可恢复,你将会丢失该卡片相关的所有操作记录。", "card-delete-pop": "所有的活动将从活动摘要中被移除且您将无法重新打开该卡片。此操作无法撤销。", "card-delete-suggest-archive": "您可以移动卡片到活动以便从看板中删除并保持活动。", + "card-archive-pop": "归档卡片后,卡片在此列表中将不可见。", + "card-archive-suggest-cancel": "稍后你可以从归档中恢复卡片。", "card-due": "到期", "card-due-on": "期限", "card-spent": "耗时", @@ -202,11 +206,12 @@ "poker-finish": "完成", "poker-result-votes": "投票", "poker-result-who": "何人", - "poker-replay": "Replay", - "set-estimation": "Set Estimation", + "poker-replay": "重播", + "set-estimation": "设置预估时间", "deletePokerPopup-title": "删除计划扑克?", "poker-delete-pop": "永久删除。对该计划扑克的所有操作记录将会丢失。", "cardDeletePopup-title": "彻底删除卡片?", + "cardArchivePopup-title": "归档卡片?", "cardDetailsActionsPopup-title": "卡片操作", "cardLabelsPopup-title": "标签", "cardMembersPopup-title": "成员", @@ -267,15 +272,19 @@ "comment": "评论", "comment-placeholder": "添加评论", "comment-only": "仅能评论", - "comment-only-desc": "只能在卡片上评论。", + "comment-only-desc": "仅能在卡片上评论。", + "comment-delete": "确定要删除评论?", + "deleteCommentPopup-title": "删除评论?", "no-comments": "暂无评论", "no-comments-desc": "无法查看评论和活动。", "worker": "人员", "worker-desc": "只能移动卡片,分配给卡片和评论", "computer": "从本机上传", "confirm-subtask-delete-dialog": "确定要删除子任务吗?", - "confirm-checklist-delete-dialog": "确定要删除清单吗?", + "confirm-checklist-delete-popup": "确定要删除清单吗?", + "checklistDeletePopup-title": "删除待办清单?", "copy-card-link-to-clipboard": "复制卡片链接到剪贴板", + "copy-text-to-clipboard": "复制文本到剪贴板", "linkCardPopup-title": "链接卡片", "searchElementPopup-title": "搜索", "copyCardPopup-title": "复制卡片", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "修改起始日期", "editCardDueDatePopup-title": "修改截止日期", "editCustomFieldPopup-title": "编辑字段", + "addReactionPopup-title": "新增动作", "editCardSpentTimePopup-title": "修改耗时", "editLabelPopup-title": "更改标签", "editNotificationPopup-title": "编辑通知", @@ -351,10 +361,10 @@ "error-user-doesNotExist": "该用户不存在", "error-user-notAllowSelf": "无法邀请自己", "error-user-notCreated": "该用户未能成功创建", - "error-username-taken": "此用户名已存在", + "error-username-taken": "此用户名已被使用", "error-orgname-taken": "此组织名称已被使用", "error-teamname-taken": "此团队名称已被使用", - "error-email-taken": "此EMail已存在", + "error-email-taken": "此邮箱已被使用", "export-board": "导出看板", "export-board-json": "看板导出为JSON", "export-board-csv": "看板导出为CSV", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "导出看板", "exportCardPopup-title": "导出卡片", "sort": "排序", + "sorted": "已排序", + "remove-sort": "删除排序", "sort-desc": "点此来将列表排序", "list-sort-by": "按此来将列表排序:", "list-label-modifiedAt": "上次访问时间", @@ -391,7 +403,7 @@ "filter-member-label": "按成员过滤", "filter-no-member": "无成员", "filter-assignee-label": "按指定人过滤", - "filter-no-assignee": "没有代理人", + "filter-no-assignee": "没有指派人", "filter-custom-fields-label": "按自定义字段过滤", "filter-no-custom-fields": "无自定义字段", "filter-show-archive": "显示归档的列表", @@ -651,11 +663,14 @@ "automatically-field-on-card": "添加字段至新卡片", "always-field-on-card": "添加字段至所有卡片", "showLabel-field-on-card": "在迷你卡片上显示字段标签", + "showSum-field-on-list": "在列表顶部显示字段总和", "yes": "是", "no": "否", "accounts": "账号", "accounts-allowEmailChange": "允许邮箱变更", "accounts-allowUserNameChange": "允许变更用户名", + "tableVisibilityMode-allowPrivateOnly": "看板可见性:仅显示私人看板", + "tableVisibilityMode": "看板可见性", "createdAt": "创建于", "modifiedAt": "修改时间", "verified": "已验证", @@ -825,6 +840,7 @@ "error-undefined": "出了点问题", "error-ldap-login": "尝试登录时出错", "display-authentication-method": "显示认证方式", + "oidc-button-text": "自定义 OIDC 按钮文本", "default-authentication-method": "默认认证方式", "duplicate-board": "复制看板", "org-number": "组织数量为:", @@ -985,14 +1001,14 @@ "previous-page": "上一页", "heading-notes": "注释", "globalSearch-instructions-heading": "查询指示信息", - "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-description": "搜索可以包括用于细化搜索的运算符。 运算符是通过编写以冒号分隔的运算符名称和值来指定的。 例如,`list:Blocked` 的运算符规范会将搜索限制为包含在名为 *Blocked* 的列表中的卡片。 如果值包含空格或特殊字符,则必须用引号括起来(例如`__operator_list__:\"To Review\"`)。", "globalSearch-instructions-operators": "可利用的维护人员", "globalSearch-instructions-operator-board": "看板:看板中的卡片<title>必须匹配相应的*<title>*", "globalSearch-instructions-operator-list": "列表:列表内的卡片<title>必须匹配对应的*<title>*", "globalSearch-instructions-operator-swimlane": "泳道:泳道中的卡片<title>必须匹配相应的*<title>*", "globalSearch-instructions-operator-comment": "`__operator_comment__:<text>` - 卡片评论包含 *<text>*.", "globalSearch-instructions-operator-label": "标签:【标签<color>】卡片<name>要匹配*<color>*或*<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>` - 的简写 `__operator_label__:1` 或 `__operator_label__:2`", "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*", @@ -1059,5 +1075,55 @@ "maximize-card": "最大化卡片", "minimize-card": "最小化卡片", "delete-org-warning-message": "无法删除该组织,至少还有一个用户属于该组织。", - "delete-team-warning-message": "无法删除该团队,至少还有一个用户属于该团队。" + "delete-team-warning-message": "无法删除该团队,至少还有一个用户属于该团队。", + "subject": "标题", + "details": "详情", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "已打开", + "pending": "等待中", + "closed": "已关闭", + "resolved": "已解決", + "cancelled": "已取消", + "history": "历史记录", + "request": "要求", + "requests": "要求", + "help-request": "请求协助", + "editCardSortOrderPopup-title": "调整排序", + "cardDetailsPopup-title": "卡片详情", + "add-teams": "添加团队", + "add-teams-label": "已添加团队如下面列表所示:", + "remove-team-from-table": "请确认是否删除面板上此团队?此操作无法撤销。", + "confirm-btn": "确认", + "remove-btn": "移除", + "filter-card-title-label": "按卡片标题筛选", + "invite-people-success": "成功发送注册邀请", + "invite-people-error": "发送注册邀请时出错", + "can-invite-if-same-mailDomainName": "电子邮件域名", + "to-create-teams-contact-admin": "请联系管理员创建团队。", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "新建组织", + "add-organizations-label": "已添加组织如下面列表所示:", + "remove-organization-from-board": "请确认是否删除面板上此组织?此操作无法撤销。", + "to-create-organizations-contact-admin": "请联系管理员创建组织。", + "custom-legal-notice-link-url": "自定义设置法律声明地址", + "acceptance_of_our_legalNotice": "继续,即意味着您已同意接受相关声明条款约束", + "legalNotice": "法律声明", + "copied": "已复制!" } \ No newline at end of file diff --git a/i18n/zh-HK.i18n.json b/i18n/zh-HK.i18n.json index 94fd47fb5..13c5db7ca 100644 --- a/i18n/zh-HK.i18n.json +++ b/i18n/zh-HK.i18n.json @@ -96,6 +96,7 @@ "add-members": "Add Members", "added": "Added", "addMemberPopup-title": "Members", + "memberPopup-title": "Member Settings", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", "admin-announcement": "Announcement", @@ -106,6 +107,7 @@ "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.", + "app-try-reconnect": "Try to reconnect.", "archive": "Move to Archive", "archive-all": "Move All to Archive", "archive-board": "Move Board to Archive", @@ -159,6 +161,8 @@ "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-archive-pop": "Card will not be visible at this list after archiving card.", + "card-archive-suggest-cancel": "You can later restore card from Archive.", "card-due": "Due", "card-due-on": "Due on", "card-spent": "Spent Time", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "Delete planning poker?", "poker-delete-pop": "Deleting is permanent. You will lose all actions associated with this planning poker.", "cardDeletePopup-title": "Delete Card?", + "cardArchivePopup-title": "Archive Card?", "cardDetailsActionsPopup-title": "Card Actions", "cardLabelsPopup-title": "Labels", "cardMembersPopup-title": "Members", @@ -268,14 +273,18 @@ "comment-placeholder": "Write Comment", "comment-only": "Comment only", "comment-only-desc": "Can comment on cards only.", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "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?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "Copy card link to clipboard", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "Link Card", "searchElementPopup-title": "Search", "copyCardPopup-title": "Copy Card", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "Change start date", "editCardDueDatePopup-title": "Change due date", "editCustomFieldPopup-title": "Edit Field", + "addReactionPopup-title": "Add reaction", "editCardSpentTimePopup-title": "Change spent time", "editLabelPopup-title": "Change Label", "editNotificationPopup-title": "Edit Notification", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "Export board", "exportCardPopup-title": "Export card", "sort": "Sort", + "sorted": "Sorted", + "remove-sort": "Remove sort", "sort-desc": "Click to Sort List", "list-sort-by": "Sort the List By:", "list-label-modifiedAt": "Last Access Time", @@ -651,11 +663,14 @@ "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", + "showSum-field-on-list": "Show sum of fields at top of list", "yes": "Yes", "no": "No", "accounts": "Accounts", "accounts-allowEmailChange": "Allow Email Change", "accounts-allowUserNameChange": "Allow Username Change", + "tableVisibilityMode-allowPrivateOnly": "Boards visibility: Allow private boards only", + "tableVisibilityMode": "Boards visibility", "createdAt": "Created at", "modifiedAt": "Modified at", "verified": "Verified", @@ -825,6 +840,7 @@ "error-undefined": "Something went wrong", "error-ldap-login": "An error occurred while trying to login", "display-authentication-method": "Display Authentication Method", + "oidc-button-text": "Customize the OIDC button text", "default-authentication-method": "Default Authentication Method", "duplicate-board": "Duplicate Board", "org-number": "The number of organizations is:", @@ -1059,5 +1075,55 @@ "maximize-card": "Maximize Card", "minimize-card": "Minimize Card", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "Subject", + "details": "Details", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "Ticket", + "tickets": "Tickets", + "ticket-number": "Ticket Number", + "open": "Open", + "pending": "Pending", + "closed": "Closed", + "resolved": "Resolved", + "cancelled": "Cancelled", + "history": "History", + "request": "Request", + "requests": "Requests", + "help-request": "Help Request", + "editCardSortOrderPopup-title": "Change Sorting", + "cardDetailsPopup-title": "Card Details", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "Remove", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/i18n/zh-TW.i18n.json b/i18n/zh-TW.i18n.json index cf89f1ad2..64e84d54b 100644 --- a/i18n/zh-TW.i18n.json +++ b/i18n/zh-TW.i18n.json @@ -89,13 +89,14 @@ "add-subtask": "新增子任務", "add-checklist": "新增待辦清單", "add-checklist-item": "新增項目", - "convertChecklistItemToCardPopup-title": "Convert to Card", + "convertChecklistItemToCardPopup-title": "轉換為卡片", "add-cover": "新增封面", "add-label": "新增標籤", "add-list": "新增清單", "add-members": "新增成員", "added": "新增", "addMemberPopup-title": "成員", + "memberPopup-title": "成員更改", "admin": "管理員", "admin-desc": "可以瀏覽並編輯卡片,移除成員,並且更改該看板的設定", "admin-announcement": "通知", @@ -106,6 +107,7 @@ "and-n-other-card_plural": "和其他 __count__ 個卡片", "apply": "應用", "app-is-offline": "頁面載入中,請稍後。重新整理頁面將會造成尚未儲存的資料遺失,如果載入太久,請檢查伺服器是否已經停止工作。", + "app-try-reconnect": "Try to reconnect.", "archive": "封存", "archive-all": "全部封存", "archive-board": "將看板封存", @@ -159,6 +161,8 @@ "card-delete-notice": "永久刪除是無法復原的,你將會失去這張卡片的所有相關操作記錄。", "card-delete-pop": "所有的活動將從活動摘要中被移除且您將無法重新打開該卡片。此操作無法撤銷。", "card-delete-suggest-archive": "您可以移動卡片到活動以便從看板中刪除並保持活動。", + "card-archive-pop": "封存卡片後,在此清單將不會看的到卡片。 ", + "card-archive-suggest-cancel": "你可以稍後從封存中還原卡片。", "card-due": "到期日", "card-due-on": "期限", "card-spent": "耗時", @@ -207,6 +211,7 @@ "deletePokerPopup-title": "刪除規劃撲克?", "poker-delete-pop": "刪除是永遠的,你會失去所有與此規劃撲克相關動作關聯", "cardDeletePopup-title": "徹底刪除卡片?", + "cardArchivePopup-title": "封存卡片嗎?", "cardDetailsActionsPopup-title": "卡片操作", "cardLabelsPopup-title": "標籤", "cardMembersPopup-title": "成員", @@ -268,14 +273,18 @@ "comment-placeholder": "撰寫文字", "comment-only": "僅能評論", "comment-only-desc": "只能在卡片上發表評論。", + "comment-delete": "Are you sure you want to delete the comment?", + "deleteCommentPopup-title": "Delete comment?", "no-comments": "暫無評論", "no-comments-desc": "無法檢視評論和活動。", "worker": "工作者", "worker-desc": "只能移動卡片,分配給自己及發表評論。", "computer": "從本機上傳", "confirm-subtask-delete-dialog": "確定要刪除子任務嗎?", - "confirm-checklist-delete-dialog": "確定要刪除清單嗎?", + "confirm-checklist-delete-popup": "Are you sure you want to delete the checklist?", + "checklistDeletePopup-title": "Delete Checklist?", "copy-card-link-to-clipboard": "將卡片連結複製到剪貼簿", + "copy-text-to-clipboard": "Copy text to clipboard", "linkCardPopup-title": "連結卡片", "searchElementPopup-title": "搜尋", "copyCardPopup-title": "複製卡片", @@ -322,6 +331,7 @@ "editCardStartDatePopup-title": "變更開始日期", "editCardDueDatePopup-title": "變更到期日期", "editCustomFieldPopup-title": "編輯欄位", + "addReactionPopup-title": "新增反應", "editCardSpentTimePopup-title": "變更耗費時間", "editLabelPopup-title": "更改標籤", "editNotificationPopup-title": "更改通知", @@ -368,6 +378,8 @@ "exportBoardPopup-title": "匯出看板", "exportCardPopup-title": "匯出卡片", "sort": "排序", + "sorted": "已排序", + "remove-sort": "移除排序", "sort-desc": "點選排序清單", "list-sort-by": "清單排序依照:", "list-label-modifiedAt": "最後存取時間", @@ -574,7 +586,7 @@ "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", + "automatic-linked-url-schemes": "自定義 URL 結構應該自動地變為可點擊。每一行一個 URL 結構", "username": "使用者名稱", "import-usernames": "匯入使用者名稱", "view-it": "檢視", @@ -651,11 +663,14 @@ "automatically-field-on-card": "新增欄位至新卡片", "always-field-on-card": "新增欄位至所有卡片", "showLabel-field-on-card": "在迷你卡片中顯示欄位標籤", + "showSum-field-on-list": "在清單頂端顯示欄位總合", "yes": "是", "no": "否", "accounts": "帳號", "accounts-allowEmailChange": "允許變更 Email", "accounts-allowUserNameChange": "允許修改使用者名稱", + "tableVisibilityMode-allowPrivateOnly": "看板可見性:只允許私人看板", + "tableVisibilityMode": "看板可見性", "createdAt": "新增於", "modifiedAt": "編輯於", "verified": "已驗證", @@ -825,6 +840,7 @@ "error-undefined": "發生問題", "error-ldap-login": "嘗試登入時出現錯誤", "display-authentication-method": "顯示認證方式", + "oidc-button-text": "自定義 OIDC 按鈕文字", "default-authentication-method": "預設認證方式", "duplicate-board": "複製看板", "org-number": "組織數是:", @@ -980,19 +996,19 @@ "operator-sort-invalid": "某種\"%s\"無效", "operator-status-invalid": "\"%s\"是無效狀態", "operator-has-invalid": "%s是無效的存在檢查", - "operator-limit-invalid": "%s is not a valid limit. Limit should be a positive integer.", + "operator-limit-invalid": "%s 不是個有效限值. 極限應該是個正整數。", "next-page": "下一頁", "previous-page": "上一頁", "heading-notes": "筆記", "globalSearch-instructions-heading": "搜尋指引", "globalSearch-instructions-description": "搜索可以包括運算子以優化搜索結果。通過冒號分隔的運算子名稱和值來指定運算子。例如,運算子指定 `list:Blocked` 則會將搜索範圍限制在名為 *Blocked* 的清單中。如果值包含空格或特殊字符,則必須將其用引號標記(例如,`__operator_list__:\"To Review\"`)。", "globalSearch-instructions-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-board": "`__operator_board__:<title>` - 必須符合相對應的 *<title>*", + "globalSearch-instructions-operator-list": "`__operator_list__:<title>` - 清單內的卡片必須符合對應的 *<title>*", + "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-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*", @@ -1030,7 +1046,7 @@ "title-alphabetically": "標題 (按字母順序)", "created-at-newest-first": "創建於(最新優先)", "created-at-oldest-first": "創建於(最早優先)", - "links-heading": "Links", + "links-heading": "連結", "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": "移動泳道流程圖", @@ -1040,10 +1056,10 @@ "custom-field-stringtemplate-separator": "Separator (use or   for a space)", "custom-field-stringtemplate-item-placeholder": "Press enter to add more items", "creator": "創建者", - "filesReportTitle": "Files Report", + "filesReportTitle": "檔案報告", "orphanedFilesReportTitle": "Orphaned Files Report", "reports": "報告", - "rulesReportTitle": "Rules Report", + "rulesReportTitle": "規則報告", "copy-swimlane": "複製泳道流程圖", "copySwimlanePopup-title": "複製泳道流程圖", "display-card-creator": "顯示卡片創建者", @@ -1054,10 +1070,60 @@ "Dot": "Dot Wait Spinner", "Double-Bounce": "Double Bounce Wait Spinner", "Rotateplane": "Rotateplane Wait Spinner", - "Scaleout": "Scaleout Wait Spinner", + "Scaleout": "橫向展開等待微調器", "Wave": "Wave Wait Spinner", - "maximize-card": "Maximize Card", - "minimize-card": "Minimize Card", + "maximize-card": "最大化卡片", + "minimize-card": "最小化卡片", "delete-org-warning-message": "Can not delete this organization, there is at least one user that belongs to it", - "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it" + "delete-team-warning-message": "Can not delete this team, there is at least one user that belongs to it", + "subject": "主旨", + "details": "內容", + "carbon-copy": "Carbon Copy (Cc:)", + "ticket": "工票", + "tickets": "工票", + "ticket-number": "工票號碼", + "open": "開啟", + "pending": "已延遲", + "closed": "已關閉", + "resolved": "已解決", + "cancelled": "已取消", + "history": "歷史紀錄", + "request": "要求", + "requests": "要求", + "help-request": "要求協助", + "editCardSortOrderPopup-title": "變更排序", + "cardDetailsPopup-title": "卡片內容", + "add-teams": "Add teams", + "add-teams-label": "Added teams are displayed below:", + "remove-team-from-table": "Are you sure you want to remove this team from the board ?", + "confirm-btn": "Confirm", + "remove-btn": "移除", + "filter-card-title-label": "Filter by card title", + "invite-people-success": "Invitation to register sent with success", + "invite-people-error": "Error while sending invitation to register", + "can-invite-if-same-mailDomainName": "Email domain name", + "to-create-teams-contact-admin": "To create teams, please contact the administrator.", + "Node_heap_total_heap_size": "Node heap: total heap size", + "Node_heap_total_heap_size_executable": "Node heap: total heap size executable", + "Node_heap_total_physical_size": "Node heap: total physical size", + "Node_heap_total_available_size": "Node heap: total available size", + "Node_heap_used_heap_size": "Node heap: used heap size", + "Node_heap_heap_size_limit": "Node heap: heap size limit", + "Node_heap_malloced_memory": "Node heap: malloced memory", + "Node_heap_peak_malloced_memory": "Node heap: peak malloced memory", + "Node_heap_does_zap_garbage": "Node heap: does zap garbage", + "Node_heap_number_of_native_contexts": "Node heap: number of native contexts", + "Node_heap_number_of_detached_contexts": "Node heap: number of detached contexts", + "Node_memory_usage_rss": "Node memory usage: resident set size", + "Node_memory_usage_heap_total": "Node memory usage: total size of the allocated heap", + "Node_memory_usage_heap_used": "Node memory usage: actual memory used", + "Node_memory_usage_external": "Node memory usage: external", + "add-organizations": "Add organizations", + "add-organizations-label": "Added organizations are displayed below:", + "remove-organization-from-board": "Are you sure you want to remove this organization from this board ?", + "to-create-organizations-contact-admin": "To create organizations, please contact administrator.", + "custom-legal-notice-link-url": "Custom legal notice page URL", + "acceptance_of_our_legalNotice": "By continuing, you accept our", + "legalNotice": "legal notice", + "copied": "Copied!" } \ No newline at end of file diff --git a/meta/t9n-changelog/fi.md b/meta/t9n-changelog/fi.md index b27c0926d..67c7928ff 100644 --- a/meta/t9n-changelog/fi.md +++ b/meta/t9n-changelog/fi.md @@ -4,7 +4,7 @@ Tämä julkaisu lisää seuraavat ominaisuudet: - [Tarkistuslista mallit](https://github.com/wekan/wekan/pull/1470); - Lisätty [Suomenkielinen muutosloki](https://github.com/wekan/wekan/tree/devel/meta/t9n-changelog) - ja [lisää suomennoksia](https://github.com/wekan/wekan/blob/devel/sandstorm-pkgdef.capnp) + ja [lisää suomennoksia](https://github.com/wekan/wekan/blob/master/sandstorm-pkgdef.capnp) Sandstormiin. diff --git a/models/activities.js b/models/activities.js index 914af768b..9f913a554 100644 --- a/models/activities.js +++ b/models/activities.js @@ -153,7 +153,9 @@ if (Meteor.isServer) { } if (activity.listId) { const list = activity.list(); - watchers = _.union(watchers, list.watchers || []); + if (list.watchers !== undefined) { + watchers = _.union(watchers, list.watchers || []); + } params.list = list.title; params.listId = activity.listId; } diff --git a/models/boards.js b/models/boards.js index 67557abae..e0dee3f7b 100644 --- a/models/boards.js +++ b/models/boards.js @@ -500,6 +500,13 @@ Boards.attachSchema( optional: true, defaultValue: 'no-parent', }, + receivedAt: { + /** + * Date the card was received + */ + type: Date, + optional: true, + }, startAt: { /** * Starting date of the board. @@ -686,10 +693,19 @@ Boards.helpers({ { sort: sortKey }, ); }, + draggableLists() { return Lists.find({ boardId: this._id }, { sort: { sort: 1 } }); }, + /** returns the last list + * @returns Document the last list + */ + getLastList() { + const ret = Lists.findOne({ boardId: this._id }, { sort: { sort: 'desc' } }); + return ret; + }, + nullSortLists() { return Lists.find({ boardId: this._id, @@ -749,10 +765,32 @@ Boards.helpers({ return Activities.find({ boardId: this._id }, { sort: { createdAt: -1 } }); }, - activeMembers() { + activeMembers(){ return _.where(this.members, { isActive: true }); }, + activeMembers2(members, boardTeamUsers) { + let allMembers = members; + if(this.teams !== undefined && this.teams.length > 0){ + let index; + if(boardTeamUsers && boardTeamUsers.count() > 0){ + boardTeamUsers.forEach((u) => { + index = allMembers.findIndex(function(m){ return m.userId == u._id}); + if(index == -1){ + allMembers.push({ + "isActive": true, + "isAdmin": u.isAdmin !== undefined ? u.isAdmin : false, + "isCommentOnly" : false, + "isNoComments" : false, + "userId": u._id, + }); + } + }); + } + } + + return allMembers; + }, activeOrgs() { return _.where(this.orgs, { isActive: true }); @@ -836,6 +874,16 @@ Boards.helpers({ }); }, + hasAnyAllowsDate() { + const ret = this.allowsReceivedDate || this.allowsStartDate || this.allowsDueDate || this.allowsEndDate; + return ret; + }, + + hasAnyAllowsUser() { + const ret = this.allowsCreator || this.allowsMembers || this.allowsAssignee || this.allowsRequestedBy || this.allowsAssignedBy; + return ret; + }, + absoluteUrl() { return FlowRouter.url('board', { id: this._id, slug: this.slug }); }, @@ -862,6 +910,20 @@ Boards.helpers({ return _id; }, + /** sets the new label order + * @param newLabelOrderOnlyIds new order array of _id, e.g. Array(4) [ "FvtD34", "PAEgDP", "LjRBxH", "YJ8sZz" ] + */ + setNewLabelOrder(newLabelOrderOnlyIds) { + if (this.labels.length == newLabelOrderOnlyIds.length) { + if (this.labels.every(_label => newLabelOrderOnlyIds.indexOf(_label._id) >= 0)) { + const newLabels = _.sortBy(this.labels, _label => newLabelOrderOnlyIds.indexOf(_label._id)); + if (this.labels.length == newLabels.length) { + Boards.direct.update(this._id, {$set: {labels: newLabels}}); + } + } + } + }, + searchBoards(term) { check(term, Match.OneOf(String, null, undefined)); @@ -902,42 +964,51 @@ Boards.helpers({ }, searchLists(term) { - check(term, Match.OneOf(String, null, undefined)); - - const query = { boardId: this._id }; - if (this.isTemplatesBoard()) { - query.type = 'template-list'; - query.archived = false; - } else { - query.type = { $nin: ['template-list'] }; - } - const projection = { limit: 10, sort: { createdAt: -1 } }; - + let ret = null; if (term) { - const regex = new RegExp(term, 'i'); - - query.$or = [{ title: regex }, { description: regex }]; + check(term, Match.OneOf(String)); + term = term.trim(); } + if (term) { + const query = { boardId: this._id }; + if (this.isTemplatesBoard()) { + query.type = 'template-list'; + query.archived = false; + } else { + query.type = { $nin: ['template-list'] }; + } + const projection = { sort: { createdAt: -1 } }; - return Lists.find(query, projection); + if (term) { + const regex = new RegExp(term, 'i'); + + query.$or = [{ title: regex }, { description: regex }]; + } + + ret = Lists.find(query, projection); + } + return ret; }, searchCards(term, excludeLinked) { - check(term, Match.OneOf(String, null, undefined)); - - const query = { boardId: this._id }; - if (excludeLinked) { - query.linkedId = null; - } - if (this.isTemplatesBoard()) { - query.type = 'template-card'; - query.archived = false; - } else { - query.type = { $nin: ['template-card'] }; - } - const projection = { limit: 10, sort: { createdAt: -1 } }; - + let ret = null; if (term) { + check(term, Match.OneOf(String)); + term = term.trim(); + } + if (term) { + const query = { boardId: this._id }; + if (excludeLinked) { + query.linkedId = null; + } + if (this.isTemplatesBoard()) { + query.type = 'template-card'; + query.archived = false; + } else { + query.type = { $nin: ['template-card'] }; + } + const projection = { sort: { createdAt: -1 } }; + const regex = new RegExp(term, 'i'); query.$or = [ @@ -945,9 +1016,9 @@ Boards.helpers({ { description: regex }, { customFields: { $elemMatch: { value: regex } } }, ]; + ret = Cards.find(query, projection); } - - return Cards.find(query, projection); + return ret; }, // A board alwasy has another board where it deposits subtasks of thasks // that belong to itself. @@ -1577,11 +1648,13 @@ if (Meteor.isServer) { }, }); }, - setBoardTeams(boardTeamsArray, currBoardId){ + setBoardTeams(boardTeamsArray, membersArray, currBoardId){ check(boardTeamsArray, Array); + check(membersArray, Array); check(currBoardId, String); Boards.update(currBoardId, { $set: { + members: membersArray, teams: boardTeamsArray, }, }); @@ -1810,8 +1883,7 @@ if (Meteor.isServer) { */ JsonRoutes.add('GET', '/api/boards', function(req, res) { try { - const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); + Authentication.checkUserId(req.userId); JsonRoutes.sendResult(res, { code: 200, data: Boards.find( @@ -1867,8 +1939,8 @@ if (Meteor.isServer) { */ JsonRoutes.add('GET', '/api/boards/:boardId', function(req, res) { try { + Authentication.checkUserId(req.userId); const id = req.params.boardId; - Authentication.checkBoardAccess(req.userId, id); JsonRoutes.sendResult(res, { code: 200, @@ -1985,8 +2057,7 @@ if (Meteor.isServer) { * @return_type string */ JsonRoutes.add('PUT', '/api/boards/:boardId/labels', function(req, res) { - const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); + Authentication.checkUserId(req.userId); const id = req.params.boardId; try { if (req.body.hasOwnProperty('label')) { @@ -2033,10 +2104,10 @@ if (Meteor.isServer) { res, ) { try { + Authentication.checkUserId(req.userId); const boardId = req.params.boardId; const memberId = req.params.memberId; const { isAdmin, isNoComments, isCommentOnly, isWorker } = req.body; - Authentication.checkBoardAccess(req.userId, boardId); const board = Boards.findOne({ _id: boardId }); function isTrue(data) { try { @@ -2080,8 +2151,8 @@ if (Meteor.isServer) { * swimlaneId: string}] */ JsonRoutes.add('GET', '/api/boards/:boardId/attachments', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Attachments.files diff --git a/models/cardCommentReactions.js b/models/cardCommentReactions.js new file mode 100644 index 000000000..300458583 --- /dev/null +++ b/models/cardCommentReactions.js @@ -0,0 +1,59 @@ +const commentReactionSchema = new SimpleSchema({ + reactionCodepoint: { type: String, optional: false }, + userIds: { type: [String], defaultValue: [] } +}); + +CardCommentReactions = new Mongo.Collection('card_comment_reactions'); + +/** + * All reactions of a card comment + */ +CardCommentReactions.attachSchema( + new SimpleSchema({ + boardId: { + /** + * the board ID + */ + type: String, + optional: false + }, + cardId: { + /** + * the card ID + */ + type: String, + optional: false + }, + cardCommentId: { + /** + * the card comment ID + */ + type: String, + optional: false + }, + reactions: { + type: [commentReactionSchema], + defaultValue: [] + } + }), +); + +CardCommentReactions.allow({ + insert(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + update(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + remove(userId, doc) { + return allowIsBoardMember(userId, Boards.findOne(doc.boardId)); + }, + fetch: ['boardId'], +}); + + +if (Meteor.isServer) { + Meteor.startup(() => { + CardCommentReactions._collection._ensureIndex({ cardCommentId: 1 }, { unique: true }); + }); +} diff --git a/models/cardComments.js b/models/cardComments.js index 799b541d8..8dbd437e2 100644 --- a/models/cardComments.js +++ b/models/cardComments.js @@ -93,6 +93,48 @@ CardComments.helpers({ user() { return Users.findOne(this.userId); }, + + reactions() { + const cardCommentReactions = CardCommentReactions.findOne({cardCommentId: this._id}); + return !!cardCommentReactions ? cardCommentReactions.reactions : []; + }, + + toggleReaction(reactionCodepoint) { + + const cardCommentReactions = CardCommentReactions.findOne({cardCommentId: this._id}); + const reactions = !!cardCommentReactions ? cardCommentReactions.reactions : []; + const userId = Meteor.userId(); + const reaction = reactions.find(r => r.reactionCodepoint === reactionCodepoint); + + // If no reaction is set for the codepoint, add this + if (!reaction) { + reactions.push({ reactionCodepoint, userIds: [userId] }); + } else { + + // toggle user reaction upon previous reaction state + const userHasReacted = reaction.userIds.includes(userId); + if (userHasReacted) { + reaction.userIds.splice(reaction.userIds.indexOf(userId), 1); + if (reaction.userIds.length === 0) { + reactions.splice(reactions.indexOf(reaction), 1); + } + } else { + reaction.userIds.push(userId); + } + } + + // If no reaction doc exists yet create otherwise update reaction set + if (!!cardCommentReactions) { + return CardCommentReactions.update({ _id: cardCommentReactions._id }, { $set: { reactions } }); + } else { + return CardCommentReactions.insert({ + boardId: this.boardId, + cardCommentId: this._id, + cardId: this.cardId, + reactions + }); + } + } }); CardComments.hookOptions.after.update = { fetchPrevious: false }; @@ -187,20 +229,20 @@ if (Meteor.isServer) { * comment: string, * authorId: string}] */ - JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/comments', function( + JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/comments', function ( req, res, ) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCardId = req.params.cardId; JsonRoutes.sendResult(res, { code: 200, data: CardComments.find({ boardId: paramBoardId, cardId: paramCardId, - }).map(function(doc) { + }).map(function (doc) { return { _id: doc._id, comment: doc.text, @@ -228,10 +270,10 @@ if (Meteor.isServer) { JsonRoutes.add( 'GET', '/api/boards/:boardId/cards/:cardId/comments/:commentId', - function(req, res) { + function (req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCommentId = req.params.commentId; const paramCardId = req.params.cardId; JsonRoutes.sendResult(res, { @@ -264,10 +306,10 @@ if (Meteor.isServer) { JsonRoutes.add( 'POST', '/api/boards/:boardId/cards/:cardId/comments', - function(req, res) { + function (req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCardId = req.params.cardId; const id = CardComments.direct.insert({ userId: req.body.authorId, @@ -310,10 +352,10 @@ if (Meteor.isServer) { JsonRoutes.add( 'DELETE', '/api/boards/:boardId/cards/:cardId/comments/:commentId', - function(req, res) { + function (req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCommentId = req.params.commentId; const paramCardId = req.params.cardId; CardComments.remove({ diff --git a/models/cards.js b/models/cards.js index d43bac9b3..ac412ce77 100644 --- a/models/cards.js +++ b/models/cards.js @@ -1168,6 +1168,13 @@ Cards.helpers({ } else { return card.receivedAt; } + } else if (this.isLinkedBoard()) { + const board = Boards.findOne({ _id: this.linkedId }); + if (board === undefined) { + return null; + } else { + return board.receivedAt; + } } else { return this.receivedAt; } @@ -1176,6 +1183,8 @@ Cards.helpers({ setReceived(receivedAt) { if (this.isLinkedCard()) { return Cards.update({ _id: this.linkedId }, { $set: { receivedAt } }); + } else if (this.isLinkedBoard()) { + return Boards.update({ _id: this.linkedId }, { $set: { receivedAt } }); } else { return Cards.update({ _id: this._id }, { $set: { receivedAt } }); } @@ -2007,6 +2016,7 @@ Cards.mutations({ }, addLabel(labelId) { + this.labelIds.push(labelId); return { $addToSet: { labelIds: labelId, @@ -2015,6 +2025,7 @@ Cards.mutations({ }, removeLabel(labelId) { + this.labelIds = _.without(this.labelIds, labelId); return { $pull: { labelIds: labelId, @@ -2163,13 +2174,13 @@ Cards.mutations({ }; }, - setReceived(receivedAt) { - return { - $set: { - receivedAt, - }, - }; - }, + //setReceived(receivedAt) { + // return { + // $set: { + // receivedAt, + // }, + // }; + //}, unsetReceived() { return { @@ -2179,13 +2190,13 @@ Cards.mutations({ }; }, - setStart(startAt) { - return { - $set: { - startAt, - }, - }; - }, + //setStart(startAt) { + // return { + // $set: { + // startAt, + // }, + // }; + //}, unsetStart() { return { @@ -2195,13 +2206,13 @@ Cards.mutations({ }; }, - setDue(dueAt) { - return { - $set: { - dueAt, - }, - }; - }, + //setDue(dueAt) { + // return { + // $set: { + // dueAt, + // }, + // }; + //}, unsetDue() { return { @@ -2211,13 +2222,13 @@ Cards.mutations({ }; }, - setEnd(endAt) { - return { - $set: { - endAt, - }, - }; - }, + //setEnd(endAt) { + // return { + // $set: { + // endAt, + // }, + // }; + //}, unsetEnd() { return { @@ -3101,9 +3112,9 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/swimlanes/:swimlaneId/cards', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; const paramSwimlaneId = req.params.swimlaneId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Cards.find({ @@ -3143,9 +3154,9 @@ if (Meteor.isServer) { req, res, ) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; const paramListId = req.params.listId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Cards.find({ @@ -3180,10 +3191,10 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/lists/:listId/cards/:cardId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; const paramListId = req.params.listId; const paramCardId = req.params.cardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Cards.findOne({ @@ -3330,8 +3341,8 @@ if (Meteor.isServer) { 'PUT', '/api/boards/:boardId/lists/:listId/cards/:cardId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCardId = req.params.cardId; const paramListId = req.params.listId; @@ -3688,8 +3699,8 @@ if (Meteor.isServer) { 'DELETE', '/api/boards/:boardId/lists/:listId/cards/:cardId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramListId = req.params.listId; const paramCardId = req.params.cardId; @@ -3728,11 +3739,10 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/cardsByCustomField/:customFieldId/:customFieldValue', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; const paramCustomFieldId = req.params.customFieldId; const paramCustomFieldValue = req.params.customFieldValue; - - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Cards.find({ diff --git a/models/checklistItems.js b/models/checklistItems.js index fb543716b..ebd823ea7 100644 --- a/models/checklistItems.js +++ b/models/checklistItems.js @@ -265,8 +265,8 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramItemId = req.params.itemId; const checklistItem = ChecklistItems.findOne({ _id: paramItemId }); if (checklistItem) { @@ -299,9 +299,8 @@ if (Meteor.isServer) { 'PUT', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); - const paramItemId = req.params.itemId; function isTrue(data) { @@ -351,8 +350,8 @@ if (Meteor.isServer) { 'DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramItemId = req.params.itemId; ChecklistItems.direct.remove({ _id: paramItemId }); JsonRoutes.sendResult(res, { diff --git a/models/checklists.js b/models/checklists.js index d02e848c8..30a6f2c2d 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -204,8 +204,8 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/cards/:cardId/checklists', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCardId = req.params.cardId; const checklists = Checklists.find({ cardId: paramCardId }).map(function( doc, @@ -248,8 +248,8 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramChecklistId = req.params.checklistId; const paramCardId = req.params.cardId; const checklist = Checklists.findOne({ @@ -292,8 +292,9 @@ if (Meteor.isServer) { 'POST', '/api/boards/:boardId/cards/:cardId/checklists', function(req, res) { + Authentication.checkUserId(req.userId); // Check user is logged in - Authentication.checkLoggedIn(req.userId); + //Authentication.checkLoggedIn(req.userId); const paramBoardId = req.params.boardId; // Check user has permission to add checklist to the card const board = Boards.findOne({ @@ -353,8 +354,8 @@ if (Meteor.isServer) { 'DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramChecklistId = req.params.checklistId; Checklists.remove({ _id: paramChecklistId }); JsonRoutes.sendResult(res, { diff --git a/models/customFields.js b/models/customFields.js index debd35c6a..90e199ad2 100644 --- a/models/customFields.js +++ b/models/customFields.js @@ -101,6 +101,13 @@ CustomFields.attachSchema( type: Boolean, defaultValue: false, }, + showSumAtTopOfList: { + /** + * should the sum of the custom fields be shown at top of list? + */ + type: Boolean, + defaultValue: false, + }, createdAt: { type: Date, optional: true, @@ -294,8 +301,8 @@ if (Meteor.isServer) { req, res, ) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: CustomFields.find({ boardIds: { $in: [paramBoardId] } }).map( @@ -323,8 +330,8 @@ if (Meteor.isServer) { 'GET', '/api/boards/:boardId/custom-fields/:customFieldId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramCustomFieldId = req.params.customFieldId; JsonRoutes.sendResult(res, { code: 200, @@ -347,14 +354,15 @@ if (Meteor.isServer) { * @param {boolean} showOnCard should we show the custom field on cards? * @param {boolean} automaticallyOnCard should the custom fields automatically be added on cards? * @param {boolean} showLabelOnMiniCard should the label of the custom field be shown on minicards? + * @param {boolean} showSumAtTopOfList should the sum of the custom fields be shown at top of list? * @return_type {_id: string} */ JsonRoutes.add('POST', '/api/boards/:boardId/custom-fields', function( req, res, ) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const board = Boards.findOne({ _id: paramBoardId }); const id = CustomFields.direct.insert({ name: req.body.name, @@ -363,6 +371,7 @@ if (Meteor.isServer) { showOnCard: req.body.showOnCard, automaticallyOnCard: req.body.automaticallyOnCard, showLabelOnMiniCard: req.body.showLabelOnMiniCard, + showSumAtTopOfList: req.body.showSumAtTopOfList, boardIds: [board._id], }); @@ -390,15 +399,15 @@ if (Meteor.isServer) { * @param {boolean} showOnCard should we show the custom field on cards * @param {boolean} automaticallyOnCard should the custom fields automatically be added on cards * @param {boolean} showLabelOnMiniCard should the label of the custom field be shown on minicards + * @param {boolean} showSumAtTopOfList should the sum of the custom fields be shown at top of list * @return_type {_id: string} */ JsonRoutes.add( 'PUT', '/api/boards/:boardId/custom-fields/:customFieldId', (req, res) => { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); - const paramFieldId = req.params.customFieldId; if (req.body.hasOwnProperty('name')) { @@ -444,6 +453,14 @@ if (Meteor.isServer) { ); } + if (req.body.hasOwnProperty('showSumAtTopOfList')) { + CustomFields.direct.update( + { _id: paramFieldId }, + { $set: { showSumAtTopOfList: req.body.showSumAtTopOfList } }, + ); + } + + JsonRoutes.sendResult(res, { code: 200, data: { _id: paramFieldId }, @@ -462,9 +479,8 @@ if (Meteor.isServer) { 'POST', '/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items', (req, res) => { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); - const paramCustomFieldId = req.params.customFieldId; const paramItems = req.body.items; @@ -506,9 +522,8 @@ if (Meteor.isServer) { 'PUT', '/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items/:dropdownItemId', (req, res) => { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); - const paramDropdownItemId = req.params.dropdownItemId; const paramCustomFieldId = req.params.customFieldId; const paramName = req.body.name; @@ -548,9 +563,8 @@ if (Meteor.isServer) { 'DELETE', '/api/boards/:boardId/custom-fields/:customFieldId/dropdown-items/:dropdownItemId', (req, res) => { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); - paramCustomFieldId = req.params.customFieldId; paramDropdownItemId = req.params.dropdownItemId; @@ -584,8 +598,8 @@ if (Meteor.isServer) { 'DELETE', '/api/boards/:boardId/custom-fields/:customFieldId', function(req, res) { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const id = req.params.customFieldId; CustomFields.remove({ _id: id, boardIds: { $in: [paramBoardId] } }); JsonRoutes.sendResult(res, { diff --git a/models/export.js b/models/export.js index da8e3a491..a28f243ef 100644 --- a/models/export.js +++ b/models/export.js @@ -167,25 +167,38 @@ if (Meteor.isServer) { const exporter = new Exporter(boardId); if (exporter.canExport(user) || impersonateDone) { if (impersonateDone) { - // TODO: Checking for CSV or TSV export type does not work: - // let exportType = 'export' + params.query.delimiter ? 'CSV' : 'TSV'; - // So logging export to CSV: let exportType = 'exportCSV'; + if( params.query.delimiter == "\t" ) { + exportType = 'exportTSV'; + } ImpersonatedUsers.insert({ adminId: adminId, boardId: boardId, reason: exportType, }); } - - body = params.query.delimiter - ? exporter.buildCsv(params.query.delimiter) - : exporter.buildCsv(); - //'Content-Length': body.length, - res.writeHead(200, { - 'Content-Type': params.query.delimiter ? 'text/csv' : 'text/tsv', - }); - res.write(body); + + let userLanguage = 'en'; + if (user && user.profile) { + userLanguage = user.profile.language + } + + if( params.query.delimiter == "\t" ) { + // TSV file + res.writeHead(200, { + 'Content-Type': 'text/tsv', + }); + } + else { + // CSV file (comma or semicolon) + res.writeHead(200, { + 'Content-Type': 'text/csv; charset=utf-8', + }); + // Adding UTF8 BOM to quick fix MS Excel issue + // use Uint8Array to prevent from converting bytes to string + res.write(new Uint8Array([0xEF, 0xBB, 0xBF])); + } + res.write(exporter.buildCsv(params.query.delimiter, userLanguage)); res.end(); } else { res.writeHead(403); diff --git a/models/exportExcel.js b/models/exportExcel.js index 6ba7effdf..f7f861141 100644 --- a/models/exportExcel.js +++ b/models/exportExcel.js @@ -49,8 +49,13 @@ runOnServer(function() { isAdmin: true, }); } - - const exporterExcel = new ExporterExcel(boardId); + + let userLanguage = 'en'; + if(user && user.profile){ + userLanguage = user.profile.language + } + + const exporterExcel = new ExporterExcel(boardId, userLanguage); if (exporterExcel.canExport(user) || impersonateDone) { if (impersonateDone) { ImpersonatedUsers.insert({ diff --git a/models/exporter.js b/models/exporter.js index 3a671fce4..f05b86881 100644 --- a/models/exporter.js +++ b/models/exporter.js @@ -197,65 +197,43 @@ export class Exporter { return result; } - buildCsv(delimiter = ',') { + buildCsv(userDelimiter = ',', userLanguage='en') { const result = this.build(); const columnHeaders = []; const cardRows = []; const papaconfig = { - delimiter, // get parameter (was: auto-detect) - worker: true, - }; - - /* - newline: "", // auto-detect + quotes: true, quoteChar: '"', escapeChar: '"', + delimiter: userDelimiter, header: true, - transformHeader: undefined, - dynamicTyping: false, - preview: 0, - encoding: "", - comments: false, - step: undefined, - complete: undefined, - error: undefined, - download: false, - downloadRequestHeaders: undefined, - downloadRequestBody: undefined, - skipEmptyLines: false, - chunk: undefined, - chunkSize: undefined, - fastMode: undefined, - beforeFirstChunk: undefined, - withCredentials: undefined, - transform: undefined + newline: "\r\n", + skipEmptyLines: false, + escapeFormulae: true, }; - */ - - //delimitersToGuess: [',', '\t', '|', ';', Papa.RECORD_SEP, Papa.UNIT_SEP] columnHeaders.push( - 'Title', - 'Description', - 'Status', - 'Swimlane', - 'Owner', - 'Requested by', - 'Assigned by', - 'Members', - 'Assignees', - 'Labels', - 'Start at', - 'Due at', - 'End at', - 'Over time', - 'Spent time (hours)', - 'Created at', - 'Last modified at', - 'Last activity', - 'Vote', - 'Archived', + TAPi18n.__('title','',userLanguage), + TAPi18n.__('description','',userLanguage), + TAPi18n.__('list','',userLanguage), + TAPi18n.__('swimlane','',userLanguage), + TAPi18n.__('owner','',userLanguage), + TAPi18n.__('requested-by','',userLanguage), + TAPi18n.__('assigned-by','',userLanguage), + TAPi18n.__('members','',userLanguage), + TAPi18n.__('assignee','',userLanguage), + TAPi18n.__('labels','',userLanguage), + TAPi18n.__('card-start','',userLanguage), + TAPi18n.__('card-due','',userLanguage), + TAPi18n.__('card-end','',userLanguage), + TAPi18n.__('overtime-hours','',userLanguage), + TAPi18n.__('spent-time-hours','',userLanguage), + TAPi18n.__('createdAt','',userLanguage), + TAPi18n.__('last-modified-at','',userLanguage), + TAPi18n.__('last-activity','',userLanguage), + TAPi18n.__('voting','',userLanguage), + TAPi18n.__('archived','',userLanguage), ); const customFieldMap = {}; let i = 0; @@ -283,30 +261,8 @@ export class Exporter { } i++; }); - cardRows.push([[columnHeaders]]); - /* TODO: Try to get translations working. - These currently only bring English translations. - TAPi18n.__('title'), - TAPi18n.__('description'), - TAPi18n.__('status'), - TAPi18n.__('swimlane'), - TAPi18n.__('owner'), - TAPi18n.__('requested-by'), - TAPi18n.__('assigned-by'), - TAPi18n.__('members'), - TAPi18n.__('assignee'), - TAPi18n.__('labels'), - TAPi18n.__('card-start'), - TAPi18n.__('card-due'), - TAPi18n.__('card-end'), - TAPi18n.__('overtime-hours'), - TAPi18n.__('spent-time-hours'), - TAPi18n.__('createdAt'), - TAPi18n.__('last-modified-at'), - TAPi18n.__('last-activity'), - TAPi18n.__('voting'), - TAPi18n.__('archived'), - */ + //cardRows.push([[columnHeaders]]); + cardRows.push(columnHeaders); result.cards.forEach((card) => { const currentRow = []; @@ -409,7 +365,8 @@ export class Exporter { currentRow.push(customFieldValuesToPush[valueIndex]); } } - cardRows.push([[currentRow]]); + //cardRows.push([[currentRow]]); + cardRows.push(currentRow); }); return Papa.unparse(cardRows, papaconfig); diff --git a/models/lists.js b/models/lists.js index 4bd9839a3..1e9868d5d 100644 --- a/models/lists.js +++ b/models/lists.js @@ -467,8 +467,8 @@ if (Meteor.isServer) { */ JsonRoutes.add('GET', '/api/boards/:boardId/lists', function(req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, @@ -502,9 +502,9 @@ if (Meteor.isServer) { res, ) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; const paramListId = req.params.listId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Lists.findOne({ @@ -531,8 +531,8 @@ if (Meteor.isServer) { */ JsonRoutes.add('POST', '/api/boards/:boardId/lists', function(req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const board = Boards.findOne(paramBoardId); const id = Lists.insert({ title: req.body.title, @@ -569,8 +569,8 @@ if (Meteor.isServer) { res, ) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const paramListId = req.params.listId; Lists.remove({ _id: paramListId, boardId: paramBoardId }); JsonRoutes.sendResult(res, { diff --git a/models/org.js b/models/org.js index 8efa9b64b..bba6a1e92 100644 --- a/models/org.js +++ b/models/org.js @@ -217,7 +217,7 @@ if (Meteor.isServer) { // Index for Organization name. Meteor.startup(() => { // Org._collection._ensureIndex({ name: -1 }); - Org._collection._ensureIndex({ orgDisplayName: -1 }); + Org._collection._ensureIndex({ orgDisplayName: 1 }); }); } diff --git a/models/server/ExporterExcel.js b/models/server/ExporterExcel.js index e4a4c54c6..1f0736acf 100644 --- a/models/server/ExporterExcel.js +++ b/models/server/ExporterExcel.js @@ -3,8 +3,9 @@ import { createWorkbook } from './createWorkbook'; // exporter maybe is broken since Gridfs introduced, add fs and path class ExporterExcel { - constructor(boardId) { + constructor(boardId, userLanguage) { this._boardId = boardId; + this.userLanguage = userLanguage; } build(res) { @@ -155,16 +156,39 @@ class ExporterExcel { return user; }); + + //init exceljs workbook const workbook = createWorkbook(); - workbook.creator = TAPi18n.__('export-board'); - workbook.lastModifiedBy = TAPi18n.__('export-board'); + workbook.creator = TAPi18n.__('export-board','',this.userLanguage); + workbook.lastModifiedBy = TAPi18n.__('export-board','',this.userLanguage); workbook.created = new Date(); workbook.modified = new Date(); workbook.lastPrinted = new Date(); const filename = `${result.title}.xlsx`; //init worksheet - const worksheet = workbook.addWorksheet(result.title, { + let worksheetTitle = result.title; + if (worksheetTitle.length > 31) { + // MS Excel doesn't allow worksheet name longer than 31 chars + // Exceljs truncate names to 31 chars + let words = worksheetTitle.split(' '); + let tmpTitle = ''; + for (let i=0;i<words.length; i++) { + if (words[0].length > 27) { + // title has no spaces + tmpTitle = words[0].substr(0,27) + ' '; + break; + } + if(tmpTitle.length + words[i].length < 27) { + tmpTitle += words[i] + ' '; + } + else { + break; + } + } + worksheetTitle = tmpTitle + '...'; + } + const worksheet = workbook.addWorksheet(worksheetTitle, { properties: { tabColor: { argb: 'FFC0000', @@ -176,7 +200,7 @@ class ExporterExcel { }, }); //get worksheet - const ws = workbook.getWorksheet(result.title); + const ws = workbook.getWorksheet(worksheetTitle); ws.properties.defaultRowHeight = 20; //init columns //Excel font. Western: Arial. zh-CN: 宋体 @@ -308,7 +332,7 @@ class ExporterExcel { }; ws.getCell('A1').alignment = { vertical: 'middle', - horizontal: 'center', + horizontal: 'left', }; ws.getRow(1).height = 40; //get member and assignee info @@ -351,6 +375,7 @@ class ExporterExcel { } //add data +8 hours function addTZhours(jdate) { + if (!jdate) { return ' '; } const curdate = new Date(jdate); const checkCorrectDate = moment(curdate); if (checkCorrectDate.isValid()) { @@ -363,31 +388,7 @@ class ExporterExcel { //return new Date(curdate.setHours(curdate.getHours() + 8)); //return curdate; } - //add blank row - ws.addRow().values = ['', '', '', '', '', '']; - //add kanban info - ws.addRow().values = [ - TAPi18n.__('createdAt'), - addTZhours(result.createdAt), - TAPi18n.__('modifiedAt'), - addTZhours(result.modifiedAt), - TAPi18n.__('members'), - jmem, - ]; - ws.getRow(3).font = { - name: TAPi18n.__('excel-font'), - size: 10, - bold: true, - }; - ws.mergeCells('F3:R3'); - ws.getCell('B3').style = { - font: { - name: TAPi18n.__('excel-font'), - size: '10', - bold: true, - }, - numFmt: 'yyyy/mm/dd hh:mm:ss', - }; + //cell center function cellCenter(cellno) { ws.getCell(cellno).alignment = { @@ -403,13 +404,14 @@ class ExporterExcel { wrapText: true, }; } - cellCenter('A3'); - cellCenter('B3'); - cellCenter('C3'); - cellCenter('D3'); - cellCenter('E3'); - cellLeft('F3'); - ws.getRow(3).height = 20; + // cell Card alignment + function cellCardAlignment(cellno) { + ws.getCell(cellno).alignment = { + vertical: 'top', + horizontal: 'left', + wrapText: true, + }; + } //all border function allBorder(cellno) { ws.getCell(cellno).border = { @@ -427,12 +429,86 @@ class ExporterExcel { }, }; } - allBorder('A3'); - allBorder('B3'); - allBorder('C3'); - allBorder('D3'); - allBorder('E3'); - allBorder('F3'); + + //add blank row + ws.addRow().values = ['', '', '', '', '', '']; + + //add board description + ws.addRow().values = [ + TAPi18n.__('description','',this.userLanguage), + result.description, + ]; + + ws.mergeCells('B3:H3'); + ws.getRow(3).height = 40; + // In MS Excel, we can't use the AutoFit feature on a column that contains a cell merged with cells in other columns. + // Likewise, we can't use AutoFit on a row that contains a cell merged with cells in other rows. + ws.getRow(3).font = { + name: TAPi18n.__('excel-font'), + size: 10, + }; + ws.getCell('A3').style = { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + bold: true, + }, + }; + ws.getCell(`B3`).alignment = { + wrapText: true, + vertical: 'middle', + }; + cellCenter('A3'); + + //add blank row + ws.addRow().values = ['', '', '', '', '', '']; + + //add kanban info + ws.addRow().values = [ + TAPi18n.__('createdAt','',this.userLanguage), + addTZhours(result.createdAt), + TAPi18n.__('modifiedAt','',this.userLanguage), + addTZhours(result.modifiedAt), + TAPi18n.__('members','',this.userLanguage), + jmem, + ]; + ws.getRow(5).font = { + name: TAPi18n.__('excel-font'), + size: 10, + bold: true, + }; + ws.mergeCells('F5:R5'); + ws.getCell('B5').style = { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + bold: true, + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }; + ws.getCell('D5').style = { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + bold: true, + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }; + + cellCenter('A5'); + cellCenter('B5'); + cellCenter('C5'); + cellCenter('D5'); + cellCenter('E5'); + cellLeft('F5'); + ws.getRow(5).height = 20; + + allBorder('A5'); + allBorder('B5'); + allBorder('C5'); + allBorder('D5'); + allBorder('E5'); + allBorder('F5'); //add blank row ws.addRow().values = [ '', @@ -455,65 +531,65 @@ class ExporterExcel { //ws.addRow().values = ['编号', '标题', '创建人', '创建时间', '更新时间', '列表', '成员', '描述', '标签']; //this is where order in which the excel file generates ws.addRow().values = [ - TAPi18n.__('number'), - TAPi18n.__('title'), - TAPi18n.__('description'), - TAPi18n.__('parent-card'), - TAPi18n.__('owner'), - TAPi18n.__('createdAt'), - TAPi18n.__('last-modified-at'), - TAPi18n.__('card-received'), - TAPi18n.__('card-start'), - TAPi18n.__('card-due'), - TAPi18n.__('card-end'), - TAPi18n.__('list'), - TAPi18n.__('swimlane'), - TAPi18n.__('assignee'), - TAPi18n.__('members'), - TAPi18n.__('labels'), - TAPi18n.__('overtime-hours'), - TAPi18n.__('spent-time-hours'), + TAPi18n.__('number','',this.userLanguage), + TAPi18n.__('title','',this.userLanguage), + TAPi18n.__('description','',this.userLanguage), + TAPi18n.__('parent-card','',this.userLanguage), + TAPi18n.__('owner','',this.userLanguage), + TAPi18n.__('createdAt','',this.userLanguage), + TAPi18n.__('last-modified-at','',this.userLanguage), + TAPi18n.__('card-received','',this.userLanguage), + TAPi18n.__('card-start','',this.userLanguage), + TAPi18n.__('card-due','',this.userLanguage), + TAPi18n.__('card-end','',this.userLanguage), + TAPi18n.__('list','',this.userLanguage), + TAPi18n.__('swimlane','',this.userLanguage), + TAPi18n.__('assignee','',this.userLanguage), + TAPi18n.__('members','',this.userLanguage), + TAPi18n.__('labels','',this.userLanguage), + TAPi18n.__('overtime-hours','',this.userLanguage), + TAPi18n.__('spent-time-hours','',this.userLanguage), ]; - ws.getRow(5).height = 20; - allBorder('A5'); - allBorder('B5'); - allBorder('C5'); - allBorder('D5'); - allBorder('E5'); - allBorder('F5'); - allBorder('G5'); - allBorder('H5'); - allBorder('I5'); - allBorder('J5'); - allBorder('K5'); - allBorder('L5'); - allBorder('M5'); - allBorder('N5'); - allBorder('O5'); - allBorder('P5'); - allBorder('Q5'); - allBorder('R5'); - cellCenter('A5'); - cellCenter('B5'); - cellCenter('C5'); - cellCenter('D5'); - cellCenter('E5'); - cellCenter('F5'); - cellCenter('G5'); - cellCenter('H5'); - cellCenter('I5'); - cellCenter('J5'); - cellCenter('K5'); - cellCenter('L5'); - cellCenter('M5'); - cellCenter('N5'); - cellCenter('O5'); - cellCenter('P5'); - cellCenter('Q5'); - cellCenter('R5'); - ws.getRow(5).font = { + ws.getRow(7).height = 20; + allBorder('A7'); + allBorder('B7'); + allBorder('C7'); + allBorder('D7'); + allBorder('E7'); + allBorder('F7'); + allBorder('G7'); + allBorder('H7'); + allBorder('I7'); + allBorder('J7'); + allBorder('K7'); + allBorder('L7'); + allBorder('M7'); + allBorder('N7'); + allBorder('O7'); + allBorder('P7'); + allBorder('Q7'); + allBorder('R7'); + cellCenter('A7'); + cellCenter('B7'); + cellCenter('C7'); + cellCenter('D7'); + cellCenter('E7'); + cellCenter('F7'); + cellCenter('G7'); + cellCenter('H7'); + cellCenter('I7'); + cellCenter('J7'); + cellCenter('K7'); + cellCenter('L7'); + cellCenter('M7'); + cellCenter('N7'); + cellCenter('O7'); + cellCenter('P7'); + cellCenter('Q7'); + cellCenter('R7'); + ws.getRow(7).font = { name: TAPi18n.__('excel-font'), - size: 12, + size: 10, bold: true, }; //add blank row @@ -568,8 +644,13 @@ class ExporterExcel { jcard.isOvertime ? 'true' : 'false', jcard.spentTime, ]; - const y = Number(i) + 6; + const y = Number(i) + 8; //ws.getRow(y).height = 25; + ws.getRow(y).font = { + name: TAPi18n.__('excel-font'), + size: 10, + }; + // Border allBorder(`A${y}`); allBorder(`B${y}`); allBorder(`C${y}`); @@ -588,22 +669,216 @@ class ExporterExcel { allBorder(`P${y}`); allBorder(`Q${y}`); allBorder(`R${y}`); - cellCenter(`A${y}`); - ws.getCell(`B${y}`).alignment = { + // Alignment + ws.getCell(`A${y}`).alignment = { + vertical: 'top', + horizontal: 'right', wrapText: true, }; - ws.getCell(`C${y}`).alignment = { + cellCardAlignment(`B${y}`); + cellCardAlignment(`C${y}`); + cellCardAlignment(`D${y}`); + cellCardAlignment(`E${y}`); + cellCardAlignment(`F${y}`); + cellCardAlignment(`G${y}`); + cellCardAlignment(`H${y}`); + cellCardAlignment(`I${y}`); + cellCardAlignment(`J${y}`); + cellCardAlignment(`K${y}`); + cellCardAlignment(`L${y}`); + cellCardAlignment(`M${y}`); + cellCardAlignment(`N${y}`); + cellCardAlignment(`O${y}`); + cellCardAlignment(`P${y}`); + ws.getCell(`Q${y}`).alignment = { + vertical: 'top', + horizontal: 'center', wrapText: true, }; - ws.getCell(`M${y}`).alignment = { + ws.getCell(`R${y}`).alignment = { + vertical: 'top', + horizontal: 'center', wrapText: true, }; - ws.getCell(`N${y}`).alignment = { + } + + + + //Activities worksheet + //init worksheet + const worksheet2 = workbook.addWorksheet(TAPi18n.__('activity','',this.userLanguage), { + properties: { + tabColor: { + argb: 'FFC0000', + }, + }, + pageSetup: { + paperSize: 9, + orientation: 'landscape', + }, + }); + //get worksheet + const ws2 = workbook.getWorksheet(TAPi18n.__('activity','',this.userLanguage)); + ws2.properties.defaultRowHeight = 20; + //init columns + ws2.columns = [ + { + key: 'a', + width: 14, + }, + { + key: 'b', + width: 60, + }, + { + key: 'c', + width: 40, + }, + { + key: 'd', + width: 40, + }, + { + key: 'e', + width: 30, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + { + key: 'f', + width: 30, + style: { + font: { + name: TAPi18n.__('excel-font'), + size: '10', + }, + numFmt: 'yyyy/mm/dd hh:mm:ss', + }, + }, + ]; + // cell Card alignment + function cellCardAlignmentWs2(cellno) { + ws2.getCell(cellno).alignment = { + vertical: 'top', + horizontal: 'left', wrapText: true, }; - ws.getCell(`O${y}`).alignment = { + } + //all border + function allBorderWs2(cellno) { + ws2.getCell(cellno).border = { + top: { + style: 'thin', + }, + left: { + style: 'thin', + }, + bottom: { + style: 'thin', + }, + right: { + style: 'thin', + }, + }; + } + + //add title line + ws2.mergeCells('A1:F1'); + ws2.getCell('A1').value = result.title; + ws2.getCell('A1').style = { + font: { + name: TAPi18n.__('excel-font'), + size: '20', + }, + }; + ws2.getCell('A1').alignment = { + vertical: 'middle', + horizontal: 'center', + wrapText: true, + }; + ws2.getRow(1).height = 40; + + //add blank row + ws2.addRow().values = ['', '', '', '', '', '']; + + //add comment title + ws2.addRow().values = [ + TAPi18n.__('number','',this.userLanguage), + TAPi18n.__('activity','',this.userLanguage), + TAPi18n.__('card','',this.userLanguage), + TAPi18n.__('owner','',this.userLanguage), + TAPi18n.__('createdAt','',this.userLanguage), + TAPi18n.__('last-modified-at','',this.userLanguage), + ]; + ws2.getRow(3).height = 20; + ws2.getRow(3).font = { + name: TAPi18n.__('excel-font'), + size: 10, + bold: true, + }; + ws2.getRow(3).alignment = { + vertical: 'middle', + horizontal: 'center', + wrapText: true, + }; + allBorderWs2('A3'); + allBorderWs2('B3'); + allBorderWs2('C3'); + allBorderWs2('D3'); + allBorderWs2('E3'); + allBorderWs2('F3'); + + //add comment info + let commentcnt = 0; + for (const i in result.comments) { + const jcomment = result.comments[i]; + //card title + const parentCard = result.cards.find( + (card) => card._id === jcomment.cardId, + ); + jcomment.cardTitle = parentCard ? parentCard.title : ''; + if (jcomment.cardTitle == '') { + continue; + } + //add comment detail + commentcnt++; + ws2.addRow().values = [ + commentcnt.toString(), + jcomment.text, + jcomment.cardTitle, + jmeml[jcomment.userId], + addTZhours(jcomment.createdAt), + addTZhours(jcomment.modifiedAt), + ]; + const y = commentcnt + 3; + ws2.getRow(y).font = { + name: TAPi18n.__('excel-font'), + size: 10, + }; + // Border + allBorderWs2(`A${y}`); + allBorderWs2(`B${y}`); + allBorderWs2(`C${y}`); + allBorderWs2(`D${y}`); + allBorderWs2(`E${y}`); + allBorderWs2(`F${y}`); + // Alignment + ws2.getCell(`A${y}`).alignment = { + vertical: 'top', + horizontal: 'right', wrapText: true, }; + cellCardAlignmentWs2(`B${y}`); + cellCardAlignmentWs2(`C${y}`); + cellCardAlignmentWs2(`D${y}`); + cellCardAlignmentWs2(`E${y}`); + cellCardAlignmentWs2(`F${y}`); + } workbook.xlsx.write(res).then(function () {}); } diff --git a/models/settings.js b/models/settings.js index 286ef29f9..91cd1d183 100644 --- a/models/settings.js +++ b/models/settings.js @@ -1,3 +1,5 @@ +//var nodemailer = require('nodemailer'); + // Sandstorm context is detected using the METEOR_SETTINGS environment variable // in the package definition. const isSandstorm = @@ -82,6 +84,18 @@ Settings.attachSchema( type: String, optional: true, }, + oidcBtnText: { + type: String, + optional: true, + }, + mailDomainName: { + type: String, + optional: true, + }, + legalNotice: { + type: String, + optional: true, + }, createdAt: { type: Date, denyUpdate: true, @@ -211,15 +225,43 @@ if (Meteor.isServer) { const icode = InvitationCodes.findOne(_id); const author = Users.findOne(Meteor.userId()); try { + const fullName = Users.findOne(icode.authorId) + && Users.findOne(icode.authorId).profile + && Users.findOne(icode.authorId).profile !== undefined + && Users.findOne(icode.authorId).profile.fullname ? Users.findOne(icode.authorId).profile.fullname : ""; + const params = { email: icode.email, - inviter: Users.findOne(icode.authorId).username, + inviter: fullName != "" ? fullName + " (" + Users.findOne(icode.authorId).username + " )" : Users.findOne(icode.authorId).username, user: icode.email.split('@')[0], icode: icode.code, url: FlowRouter.url('sign-up'), }; const lang = author.getLanguage(); - +/* + if (process.env.MAIL_SERVICE !== '') { + let transporter = nodemailer.createTransport({ + service: process.env.MAIL_SERVICE, + auth: { + user: process.env.MAIL_SERVICE_USER, + pass: process.env.MAIL_SERVICE_PASSWORD + }, + }) + let info = transporter.sendMail({ + to: icode.email, + from: Accounts.emailTemplates.from, + subject: TAPi18n.__('email-invite-register-subject', params, lang), + text: TAPi18n.__('email-invite-register-text', params, lang), + }) + } else { + Email.send({ + to: icode.email, + from: Accounts.emailTemplates.from, + subject: TAPi18n.__('email-invite-register-subject', params, lang), + text: TAPi18n.__('email-invite-register-text', params, lang), + }); + } +*/ Email.send({ to: icode.email, from: Accounts.emailTemplates.from, @@ -232,6 +274,20 @@ if (Meteor.isServer) { } } + function isNonAdminAllowedToSendMail(currentUser){ + const currSett = Settings.findOne({}); + let isAllowed = false; + if(currSett && currSett != undefined && currSett.disableRegistration && currSett.mailDomainName !== undefined && currSett.mailDomainName != ""){ + for(let i = 0; i < currentUser.emails.length; i++) { + if(currentUser.emails[i].address.endsWith(currSett.mailDomainName)){ + isAllowed = true; + break; + } + } + } + return isAllowed; + } + function isLdapEnabled() { return ( process.env.LDAP_ENABLE === 'true' || process.env.LDAP_ENABLE === true @@ -257,11 +313,13 @@ if (Meteor.isServer) { Meteor.methods({ sendInvitation(emails, boards) { + let rc = 0; check(emails, [String]); check(boards, [String]); const user = Users.findOne(Meteor.userId()); - if (!user.isAdmin) { + if (!user.isAdmin && !isNonAdminAllowedToSendMail(user)) { + rc = -1; throw new Meteor.Error('not-allowed'); } emails.forEach(email => { @@ -269,6 +327,7 @@ if (Meteor.isServer) { // Checks if the email is already link to an account. const userExist = Users.findOne({ email }); if (userExist) { + rc = -1; throw new Meteor.Error( 'user-exist', `The user with the email ${email} has already an account.`, @@ -295,6 +354,7 @@ if (Meteor.isServer) { if (!err && _id) { sendInvitationEmail(_id); } else { + rc = -1; throw new Meteor.Error( 'invitation-generated-fail', err.message, @@ -305,6 +365,7 @@ if (Meteor.isServer) { } } }); + return rc; }, sendSMTPTestEmail() { @@ -318,6 +379,30 @@ if (Meteor.isServer) { this.unblock(); const lang = user.getLanguage(); try { +/* + if (process.env.MAIL_SERVICE !== '') { + let transporter = nodemailer.createTransport({ + service: process.env.MAIL_SERVICE, + auth: { + user: process.env.MAIL_SERVICE_USER, + pass: process.env.MAIL_SERVICE_PASSWORD + }, + }) + let info = transporter.sendMail({ + to: user.emails[0].address, + from: Accounts.emailTemplates.from, + subject: TAPi18n.__('email-smtp-test-subject', { lng: lang }), + text: TAPi18n.__('email-smtp-test-text', { lng: lang }), + }) + } else { + Email.send({ + to: user.emails[0].address, + from: Accounts.emailTemplates.from, + subject: TAPi18n.__('email-smtp-test-subject', { lng: lang }), + text: TAPi18n.__('email-smtp-test-text', { lng: lang }), + }); + } +*/ Email.send({ to: user.emails[0].address, from: Accounts.emailTemplates.from, diff --git a/models/swimlanes.js b/models/swimlanes.js index 095268a8c..c83d8139e 100644 --- a/models/swimlanes.js +++ b/models/swimlanes.js @@ -220,7 +220,7 @@ Swimlanes.helpers({ { boardId: this.boardId, swimlaneId: { $in: [this._id, ''] }, - archived: false, + //archived: false, }, { sort: ['sort'] }, ); @@ -388,8 +388,8 @@ if (Meteor.isServer) { */ JsonRoutes.add('GET', '/api/boards/:boardId/swimlanes', function(req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, @@ -424,9 +424,9 @@ if (Meteor.isServer) { res, ) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; const paramSwimlaneId = req.params.swimlaneId; - Authentication.checkBoardAccess(req.userId, paramBoardId); JsonRoutes.sendResult(res, { code: 200, data: Swimlanes.findOne({ @@ -454,8 +454,8 @@ if (Meteor.isServer) { */ JsonRoutes.add('POST', '/api/boards/:boardId/swimlanes', function(req, res) { try { + Authentication.checkUserId(req.userId); const paramBoardId = req.params.boardId; - Authentication.checkBoardAccess(req.userId, paramBoardId); const board = Boards.findOne(paramBoardId); const id = Swimlanes.insert({ title: req.body.title, diff --git a/models/tableVisibilityModeSettings.js b/models/tableVisibilityModeSettings.js new file mode 100644 index 000000000..c438137aa --- /dev/null +++ b/models/tableVisibilityModeSettings.js @@ -0,0 +1,73 @@ +TableVisibilityModeSettings = new Mongo.Collection('tableVisibilityModeSettings'); + +TableVisibilityModeSettings.attachSchema( + new SimpleSchema({ + _id: { + type: String, + }, + booleanValue: { + type: Boolean, + optional: true, + }, + sort: { + type: Number, + decimal: true, + }, + createdAt: { + type: Date, + optional: true, + // eslint-disable-next-line consistent-return + autoValue() { + if (this.isInsert) { + return new Date(); + } else if (this.isUpsert) { + return { $setOnInsert: new Date() }; + } else { + this.unset(); + } + }, + }, + modifiedAt: { + type: Date, + denyUpdate: false, + // eslint-disable-next-line consistent-return + autoValue() { + if (this.isInsert || this.isUpsert || this.isUpdate) { + return new Date(); + } else { + this.unset(); + } + }, + }, + }), +); + +TableVisibilityModeSettings.allow({ + update(userId) { + const user = Users.findOne(userId); + return user && user.isAdmin; + }, +}); + +if (Meteor.isServer) { + Meteor.startup(() => { + TableVisibilityModeSettings._collection._ensureIndex({ modifiedAt: -1 }); + TableVisibilityModeSettings.upsert( + { _id: 'tableVisibilityMode-allowPrivateOnly' }, + { + $setOnInsert: { + booleanValue: false, + sort: 0, + }, + }, + ); + }); +} + +TableVisibilityModeSettings.helpers({ + allowPrivateOnly() { + return TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').booleanValue; + }, +}); + +export default TableVisibilityModeSettings; diff --git a/models/team.js b/models/team.js index 39733dd39..4ebfed3e9 100644 --- a/models/team.js +++ b/models/team.js @@ -214,7 +214,7 @@ if (Meteor.isServer) { if (Meteor.isServer) { // Index for Team name. Meteor.startup(() => { - Team._collection._ensureIndex({ teamDisplayName: -1 }); + Team._collection._ensureIndex({ teamDisplayName: 1 }); }); } diff --git a/models/users.js b/models/users.js index ab9beef74..70a5b141b 100644 --- a/models/users.js +++ b/models/users.js @@ -1,3 +1,4 @@ +//var nodemailer = require('nodemailer'); import { SyncedCron } from 'meteor/percolate:synced-cron'; import ImpersonatedUsers from './impersonatedUsers'; @@ -183,6 +184,13 @@ Users.attachSchema( type: Boolean, optional: true, }, + 'profile.customFieldsGrid': { + /** + * has user at card Custom Fields have Grid (false) or one per row (true) layout? + */ + type: Boolean, + optional: true, + }, 'profile.hiddenSystemMessages': { /** * does the user want to hide system messages? @@ -428,9 +436,9 @@ Users.allow({ fetch: [], }); -// Search a user in the complete server database by its name or username. This +// Search a user in the complete server database by its name, username or emails adress. This // is used for instance to add a new user to a board. -const searchInFields = ['username', 'profile.fullname']; +const searchInFields = ['username', 'profile.fullname', 'emails.address']; Users.initEasySearch(searchInFields, { use: 'mongo-db', returnFields: [...searchInFields, 'profile.avatarUrl'], @@ -444,51 +452,57 @@ Users.safeFields = { 'profile.initials': 1, orgs: 1, teams: 1, + authenticationMethod: 1, }; if (Meteor.isClient) { Users.helpers({ isBoardMember() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return board && board.hasMember(this._id); }, isNotNoComments() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return ( board && board.hasMember(this._id) && !board.hasNoComments(this._id) ); }, isNoComments() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return board && board.hasNoComments(this._id); }, isNotCommentOnly() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return ( board && board.hasMember(this._id) && !board.hasCommentOnly(this._id) ); }, isCommentOnly() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return board && board.hasCommentOnly(this._id); }, isNotWorker() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return board && board.hasMember(this._id) && !board.hasWorker(this._id); }, isWorker() { - const board = Boards.findOne(Session.get('currentBoard')); + const board = Utils.getCurrentBoard(); return board && board.hasWorker(this._id); }, - isBoardAdmin(boardId = Session.get('currentBoard')) { - const board = Boards.findOne(boardId); + isBoardAdmin(boardId) { + let board; + if (boardId) { + board = Boards.findOne(boardId); + } else { + board = Utils.getCurrentBoard(); + } return board && board.hasAdmin(this._id); }, }); @@ -507,7 +521,7 @@ Users.helpers({ }, orgsUserBelongs() { if (this.orgs) { - return this.orgs.map(function(org){return org.orgDisplayName}).join(','); + return this.orgs.map(function(org){return org.orgDisplayName}).sort().join(','); } return ''; }, @@ -519,7 +533,7 @@ Users.helpers({ }, teamsUserBelongs() { if (this.teams) { - return this.teams.map(function(team){ return team.teamDisplayName}).join(','); + return this.teams.map(function(team){ return team.teamDisplayName}).sort().join(','); } return ''; }, @@ -650,6 +664,11 @@ Users.helpers({ return profile.hiddenSystemMessages || false; }, + hasCustomFieldsGrid() { + const profile = this.profile || {}; + return profile.customFieldsGrid || false; + }, + hasCardMaximized() { const profile = this.profile || {}; return profile.cardMaximized || false; @@ -807,6 +826,14 @@ Users.mutations({ }; }, + toggleFieldsGrid(value = false) { + return { + $set: { + 'profile.customFieldsGrid': !value, + }, + }; + }, + toggleCardMaximized(value = false) { return { $set: { @@ -909,6 +936,10 @@ Meteor.methods({ const user = Meteor.user(); user.toggleSystem(user.hasHiddenSystemMessages()); }, + toggleCustomFieldsGrid() { + const user = Meteor.user(); + user.toggleFieldsGrid(user.hasCustomFieldsGrid()); + }, toggleCardMaximized() { const user = Meteor.user(); user.toggleCardMaximized(user.hasCardMaximized()); @@ -1211,13 +1242,40 @@ if (Meteor.isServer) { } try { + const fullName = inviter.profile !== undefined && inviter.profile.fullname !== undefined ? inviter.profile.fullname : ""; + const userFullName = user.profile !== undefined && user.profile.fullname !== undefined ? user.profile.fullname : ""; const params = { - user: user.username, - inviter: inviter.username, + user: userFullName != "" ? userFullName + " (" + user.username + " )" : user.username, + inviter: fullName != "" ? fullName + " (" + inviter.username + " )" : inviter.username, board: board.title, url: board.absoluteUrl(), }; const lang = user.getLanguage(); + +/* + if (process.env.MAIL_SERVICE !== '') { + let transporter = nodemailer.createTransport({ + service: process.env.MAIL_SERVICE, + auth: { + user: process.env.MAIL_SERVICE_USER, + pass: process.env.MAIL_SERVICE_PASSWORD + }, + }) + let info = transporter.sendMail({ + to: user.emails[0].address.toLowerCase(), + from: Accounts.emailTemplates.from, + subject: TAPi18n.__('email-invite-subject', params, lang), + text: TAPi18n.__('email-invite-text', params, lang), + }) + } else { + Email.send({ + to: user.emails[0].address.toLowerCase(), + from: Accounts.emailTemplates.from, + subject: TAPi18n.__('email-invite-subject', params, lang), + text: TAPi18n.__('email-invite-text', params, lang), + }); + } +*/ Email.send({ to: user.emails[0].address.toLowerCase(), from: Accounts.emailTemplates.from, @@ -1255,7 +1313,6 @@ if (Meteor.isServer) { const userCount = Users.find().count(); if (userCount === 0) { user.isAdmin = true; - return user; } if (user.services.oidc) { @@ -1626,10 +1683,20 @@ if (Meteor.isServer) { // If ldap, bypass the inviation code if the self registration isn't allowed. // TODO : pay attention if ldap field in the user model change to another content ex : ldap field to connection_type if (doc.authenticationMethod !== 'ldap' && disableRegistration) { - const invitationCode = InvitationCodes.findOne({ - code: doc.profile.icode, - valid: true, - }); + let invitationCode = null; + if(doc.authenticationMethod.toLowerCase() == 'oauth2') + { // OIDC authentication mode + invitationCode = InvitationCodes.findOne({ + email: doc.emails[0].address.toLowerCase(), + valid: true, + }); + } + else{ + invitationCode = InvitationCodes.findOne({ + code: doc.profile.icode, + valid: true, + }); + } if (!invitationCode) { throw new Meteor.Error('error-invitation-code-not-exist'); } else { diff --git a/package-lock.json b/package-lock.json index 96a770045..59d0a8812 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6641 +1,36 @@ { "name": "wekan", - "version": "v5.47.0", - "lockfileVersion": 2, + "version": "v5.85.0", + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "version": "v5.46.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.14.6", - "@babel/runtime": "^7.14.6", - "@liradb2000/markdown-it-mermaid": "^0.4.3", - "ajv": "^6.12.6", - "babel-runtime": "^6.26.0", - "bcryptjs": "^2.4.3", - "bson": "^4.4.1", - "bunyan": "^1.8.15", - "core-js": "^2.6.12", - "dompurify": "^2.3.0", - "es6-promise": "^4.2.4", - "exceljs": "^4.2.1", - "fibers": "^5.0.0", - "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", - "jszip": "^3.6.0", - "ldapjs": "^2.3.0", - "markdown-it": "^12.1.0", - "markdown-it-emoji": "^2.0.0", - "meteor-node-stubs": "^1.0.3", - "mongodb": "^3.6.9", - "os": "^0.1.1", - "page": "^1.11.5", - "papaparse": "^5.3.1", - "qs": "^6.10.1", - "source-map-support": "^0.5.19" - }, - "devDependencies": { - "babel-plugin-istanbul": "^6.0.0", - "chai": "^4.3.4", - "flatted": "^3.2.0", - "puppeteer": "^10.0.0", - "sinon": "^11.1.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz", - "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg==" - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dependencies": { - "@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" - } - }, - "node_modules/@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==", - "dependencies": { - "@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" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@liradb2000/markdown-it-mermaid": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@liradb2000/markdown-it-mermaid/-/markdown-it-mermaid-0.4.3.tgz", - "integrity": "sha512-ieUUuwqvc4Gr7GxLCu9V6gkW8VIxX/7sjOoByERGxbRFwQGzbVHuMAu6Y63M+umFwcfxU9bE3mSbHEi60a75GQ==", - "dependencies": { - "mermaid": "^8.10.2", - "npm": "^7.16.0" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.14.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.44.tgz", - "integrity": "sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA==" - }, - "node_modules/@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/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==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/archiver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", - "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==", - "dependencies": { - "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.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/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==", - "dependencies": { - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/archiver-utils/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/archiver-utils/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=", - "dependencies": { - "precond": "0.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" - }, - "node_modules/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==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/bl/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/bl/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/bson": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz", - "integrity": "sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==", - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/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==" - }, - "node_modules/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==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/bunyan": { - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", - "integrity": "sha512-0tECWShh6wUysgucJcBAoYegf3JJoZWibxdqhTm7OHPeT42qdjkZ29QCMcKwbgU1kiH+auSIasNRXMLWXafXig==", - "engines": [ - "node >=0.10.0" - ], - "bin": { - "bunyan": "bin/bunyan" - }, - "optionalDependencies": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001242", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001242.tgz", - "integrity": "sha512-KvNuZ/duufelMB3w2xtf9gEWCSxJwUgoxOx5b6ScLXC4kPc9xsczUVCPrQU26j5kOsHM4pSUL54tAZt5THQKug==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/compress-commons": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", - "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/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==", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/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==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", - "dependencies": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" - } - }, - "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" - }, - "node_modules/d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "node_modules/d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" - }, - "node_modules/d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", - "dependencies": { - "d3-array": "^1.1.1" - } - }, - "node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "node_modules/d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" - }, - "node_modules/d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", - "dependencies": { - "d3-dsv": "1" - } - }, - "node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" - }, - "node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "node_modules/d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" - }, - "node_modules/d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", - "dependencies": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", - "dependencies": { - "d3-color": "1", - "d3-interpolate": "1" - } - }, - "node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" - }, - "node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "node_modules/d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", - "dependencies": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" - }, - "node_modules/d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dagre-d3": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz", - "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==", - "dependencies": { - "d3": "^5.14", - "dagre": "^0.8.5", - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dayjs": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", - "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.883894", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.883894.tgz", - "integrity": "sha512-33idhm54QJzf3Q7QofMgCvIVSd2o9H3kQPWaKT/fhoZh+digc+WSiMhbkeG3iN79WY4Hwr9G05NpbhEVrsOYAg==", - "dev": true - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dompurify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.0.tgz", - "integrity": "sha512-VV5C6Kr53YVHGOBKO/F86OYX6/iLTw2yVSI721gKetxpHCK/V5TaLEf9ODjRgl1KLSWRMY6cUhAbv/c+IUnwQw==" - }, - "node_modules/dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.14.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexer2/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/duplexer2/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.768", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.768.tgz", - "integrity": "sha512-I4UMZHhVSK2pwt8jOIxTi3GIuc41NkddtKT/hpuxp9GO5UWJgDKTBa4TACppbVAuKtKbMK6BhQZvT5tFF1bcNA==" - }, - "node_modules/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==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/entity-decode": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/entity-decode/-/entity-decode-2.0.2.tgz", - "integrity": "sha512-5CCY/3ci4MC1m2jlumNjWd7VBFt4VfFnmSqSNmVcXq4gxM3Vmarxtt+SvmBnzwLS669MWdVuXboNVj1qN2esVg==", - "dependencies": { - "he": "^1.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exceljs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.1.tgz", - "integrity": "sha512-EogoTdXH1X1PxqD9sV8caYd1RIfXN3PVlCV+mA/87CgdO2h4X5xAEbr7CaiP8tffz7L4aBFwsdMbjfMXi29NjA==", - "dependencies": { - "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" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/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==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", - "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/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==", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/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==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fibers": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-5.0.0.tgz", - "integrity": "sha512-UpGv/YAZp7mhKHxDvC1tColrroGRX90sSvh8RMZV9leo+e5+EkRVgCEZPlmXeo3BUNQTZxUaVdLskq1Q2FyCPg==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz", - "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", - "dev": true - }, - "node_modules/flushwritable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", - "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" - }, - "node_modules/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==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/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==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/gridfs-stream": { - "version": "1.1.1", - "resolved": "https://github.com/wekan/gridfs-stream/tarball/master", - "integrity": "sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==", - "dependencies": { - "flushwritable": "^1.0.0" - }, - "engines": { - "node": ">= 0.4.2" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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==" - }, - "node_modules/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==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/jszip/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/jszip/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/khroma": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-1.4.1.tgz", - "integrity": "sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==" - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/lazystream/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/lazystream/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ldap-filter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", - "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ldapjs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.0.tgz", - "integrity": "sha512-3Rbm3CS7vzTccpP1QnzKCEPok60L/b3BFlWU8r93P5oadCAaqCWEH9Td08crPnw4Ti20W8y0+ZKtFFNzxVu4kA==", - "dependencies": { - "abstract-logging": "^2.0.0", - "asn1": "^0.2.4", - "assert-plus": "^1.0.0", - "backoff": "^2.5.0", - "ldap-filter": "^0.3.3", - "once": "^1.4.0", - "vasync": "^2.2.0", - "verror": "^1.8.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/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=" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/markdown-it": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", - "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-emoji": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-2.0.0.tgz", - "integrity": "sha512-39j7/9vP/CPCKbEI44oV8yoPJTpvfeReTn/COgRhSpNrjWF3PfP/JUxxB0hxV6ynOY8KH8Y8aX9NMDdo6z+6YQ==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/mermaid": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.11.0.tgz", - "integrity": "sha512-c/SprR4mJ2Pj7A+3mEvva7XrhEkXQJUal7fIyOkMhOhsPX2u5gQjjm5CEhHQ6WdGsqP+yiR+Fcgnd1i8mpFK8w==", - "dependencies": { - "@braintree/sanitize-url": "^3.1.0", - "d3": "^5.7.0", - "dagre": "^0.8.4", - "dagre-d3": "^0.6.4", - "entity-decode": "^2.0.2", - "graphlib": "^2.1.7", - "khroma": "^1.1.0", - "moment-mini": "^2.22.1", - "stylis": "^3.5.2" - } - }, - "node_modules/meteor-node-stubs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.3.tgz", - "integrity": "sha512-JQwIWPfM/Oa2x1Ycwn1Q0wVVQ8b0bOLv+qs4RR/D12b5dPktLlPCRhMzWzRPncZVJtfsnKKBgPLdFmJYUqAwHg==", - "bundleDependencies": [ - "assert", - "browserify-zlib", - "buffer", - "console-browserify", - "constants-browserify", - "crypto-browserify", - "domain-browser", - "events", - "https-browserify", - "os-browserify", - "path-browserify", - "process", - "punycode", - "querystring-es3", - "readable-stream", - "stream-browserify", - "stream-http", - "string_decoder", - "timers-browserify", - "tty-browserify", - "url", - "util", - "vm-browserify" - ], - "dependencies": { - "assert": "^1.4.1", - "browserify-zlib": "^0.2.0", - "buffer": "^5.2.1", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^1.2.0", - "elliptic": "^6.5.4", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^2.1.1", - "querystring-es3": "^0.2.1", - "readable-stream": "^3.3.0", - "stream-browserify": "^2.0.2", - "stream-http": "^3.0.0", - "string_decoder": "^1.2.0", - "timers-browserify": "^2.0.10", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.11.1", - "vm-browserify": "^1.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js": { - "version": "5.4.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/assert": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/assert/node_modules/util": { - "version": "0.10.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/bn.js": { - "version": "5.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/brorand": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/browserify-aes": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-des": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign": { - "version": "4.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/meteor-node-stubs/node_modules/buffer-xor": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/cipher-base": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/console-browserify": { - "version": "1.2.0", - "inBundle": true - }, - "node_modules/meteor-node-stubs/node_modules/constants-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/core-util-is": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/create-hash": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/create-hmac": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { - "version": "3.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/meteor-node-stubs/node_modules/des.js": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { - "version": "5.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/domain-browser": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic": { - "version": "6.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash-base": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash-base/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/hash.js": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/hash.js/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/https-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/meteor-node-stubs/node_modules/inherits": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/isarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/md5.js": { - "version": "1.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/object-assign": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/os-browserify": { - "version": "0.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pako": { - "version": "1.0.11", - "inBundle": true, - "license": "(MIT AND Zlib)" - }, - "node_modules/meteor-node-stubs/node_modules/parse-asn1": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/path-browserify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pbkdf2": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/meteor-node-stubs/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/process-nextick-args": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/punycode": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring": { - "version": "0.2.0", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/querystring-es3": { - "version": "0.2.1", - "inBundle": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/meteor-node-stubs/node_modules/randombytes": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/randomfill": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/meteor-node-stubs/node_modules/readable-stream/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/ripemd160": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/meteor-node-stubs/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/setimmediate": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/sha.js": { - "version": "2.4.11", - "inBundle": true, - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "2.3.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "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" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify/node_modules/readable-stream/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-http": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/meteor-node-stubs/node_modules/stream-http/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/timers-browserify": { - "version": "2.0.12", - "inBundle": true, - "license": "MIT", - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/tty-browserify": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/url": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/util": { - "version": "0.11.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/meteor-node-stubs/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/vm-browserify": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/xtend": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/moment-mini": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz", - "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" - }, - "node_modules/mongodb": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.9.tgz", - "integrity": "sha512-1nSCKgSunzn/CXwgOWgbPHUWOO5OfERcuOWISmqd610jn0s8BU9K4879iJVabqgpPPbA6hO7rG48eq+fGED3Mg==", - "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.0.3", - "safe-buffer": "^5.1.2" - }, - "engines": { - "node": ">=4" - }, - "optionalDependencies": { - "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb/node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-7.20.3.tgz", - "integrity": "sha512-Kxk+NSnv+bcUKlWEKRaJ745AjEApYzM6GHxXs9AzR8VJiRMPcKvrIGMp+pdkIaF++2kEbcyg/Kx0FCrv+ySJiQ==", - "bundleDependencies": [ - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "ansicolors", - "ansistyles", - "archy", - "byte-size", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "leven", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "pacote", - "parse-conflict-json", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@npmcli/arborist": "^2.8.0", - "@npmcli/ci-detect": "^1.2.0", - "@npmcli/config": "^2.2.0", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.5", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "archy": "~1.0.0", - "byte-size": "^7.0.1", - "cacache": "^15.2.0", - "chalk": "^4.1.0", - "chownr": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.6.0", - "columnify": "~1.5.4", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "hosted-git-info": "^4.0.2", - "ini": "^2.0.0", - "init-package-json": "^2.0.3", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "leven": "^3.1.0", - "libnpmaccess": "^4.0.2", - "libnpmdiff": "^2.0.4", - "libnpmexec": "^2.0.0", - "libnpmfund": "^1.1.0", - "libnpmhook": "^6.0.2", - "libnpmorg": "^2.0.2", - "libnpmpack": "^2.0.1", - "libnpmpublish": "^4.0.1", - "libnpmsearch": "^3.1.1", - "libnpmteam": "^2.0.3", - "libnpmversion": "^1.2.1", - "make-fetch-happen": "^9.0.4", - "minipass": "^3.1.3", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^7.1.2", - "nopt": "^5.0.0", - "npm-audit-report": "^2.1.5", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.1", - "npm-profile": "^5.0.3", - "npm-registry-fetch": "^11.0.0", - "npm-user-validate": "^1.0.1", - "npmlog": "^5.0.0", - "opener": "^1.5.2", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^3.0.1", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "tar": "^6.1.2", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^1.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^2.0.2", - "write-file-atomic": "^3.0.3" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "2.8.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "tar": "^6.1.0", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "1.3.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "2.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ini": "^2.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "semver": "^7.3.4", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "1.8.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "infer-owner": "^1.0.4", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ajv": { - "version": "6.12.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/ansicolors": { - "version": "0.3.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ansistyles": { - "version": "0.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/asn1": { - "version": "0.2.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/npm/node_modules/assert-plus": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/asynckit": { - "version": "0.4.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aws-sign2": { - "version": "0.7.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/aws4": { - "version": "1.11.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/npm/node_modules/bin-links": { - "version": "2.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/byte-size": { - "version": "7.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "15.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/caseless": { - "version": "0.12.0", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/ansi-regex": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/code-point-at": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/colors": { - "version": "1.4.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.5.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "node_modules/npm/node_modules/combined-stream": { - "version": "1.0.8", - "inBundle": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/core-util-is": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/dashdash": { - "version": "1.14.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delayed-stream": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/ecc-jsbn": { - "version": "0.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extend": { - "version": "3.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extsprintf": { - "version": "1.3.0", - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-deep-equal": { - "version": "3.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/forever-agent": { - "version": "0.6.1", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/getpass": { - "version": "0.1.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "7.1.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.6", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/har-schema": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/har-validator": { - "version": "5.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.0", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/http-signature": { - "version": "1.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "3.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "npm-package-arg": "^8.1.2", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^3.0.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.5.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/is-typedarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/isstream": { - "version": "0.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsbn": { - "version": "0.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-schema": { - "version": "0.2.3", - "inBundle": true - }, - "node_modules/npm/node_modules/json-schema-traverse": { - "version": "0.4.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/json-stringify-safe": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsprim": { - "version": "1.4.1", - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/npm/node_modules/just-diff": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/leven": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "4.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^3.0.4", - "npm-package-arg": "^8.1.4", - "pacote": "^11.3.4", - "tar": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^2.3.0", - "@npmcli/ci-detect": "^1.3.0", - "@npmcli/run-script": "^1.8.4", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^8.1.2", - "pacote": "^11.3.1", - "proc-log": "^1.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^2.5.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "6.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^1.8.3", - "npm-package-arg": "^8.1.0", - "pacote": "^11.2.6" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "1.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.0.7", - "@npmcli/run-script": "^1.8.4", - "json-parse-even-better-errors": "^2.3.1", - "semver": "^7.3.5", - "stringify-package": "^1.0.1" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "9.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/mime-db": { - "version": "1.49.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/mime-types": { - "version": "2.1.32", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.49.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "3.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "1.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "7.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/aproba": { - "version": "1.2.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "2.7.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "4.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/string-width": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "3.0.2", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "2.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "1.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "4.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "8.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "2.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "6.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "11.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^1.1.5", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/npm/node_modules/number-is-nan": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/oauth-sign": { - "version": "0.9.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/object-assign": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "11.3.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/path-parse": { - "version": "1.0.7", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/performance-now": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/proc-log": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/process-nextick-args": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/psl": { - "version": "1.8.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/punycode": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/qs": { - "version": "6.5.2", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "2.3.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "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" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/request": { - "version": "2.88.2", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/npm/node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/resolve": { - "version": "1.20.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.6.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.9", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/sshpk": { - "version": "1.16.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ssri": { - "version": "8.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "2.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/stringify-package": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/tunnel-agent": { - "version": "0.6.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/tweetnacl": { - "version": "0.14.5", - "inBundle": true, - "license": "Unlicense" - }, - "node_modules/npm/node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/npm/node_modules/uri-js": { - "version": "4.4.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/uuid": { - "version": "3.4.0", - "inBundle": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/npm/node_modules/verror": { - "version": "1.10.0", - "engines": [ - "node >=0.6.0" - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/object-inspect": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/page": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/page/-/page-1.11.6.tgz", - "integrity": "sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g==", - "dependencies": { - "path-to-regexp": "~1.2.1" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", - "integrity": "sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.2.1.tgz", - "integrity": "sha1-szcFwUAjTYc8hyHHuf2LVB7Tr/k=", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.0.0.tgz", - "integrity": "sha512-AxHvCb9IWmmP3gMW+epxdj92Gglii+6Z4sb+W+zc2hTTu10HF0yg6hGXot5O74uYkVqG3lfDRLfnRpi6WOwi5A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "debug": "4.3.1", - "devtools-protocol": "0.0.883894", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.1", - "pkg-dir": "4.2.0", - "progress": "2.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.0.0", - "unbzip2-stream": "1.3.3", - "ws": "7.4.6" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/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==" - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sinon": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz", - "integrity": "sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.0", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sinon/node_modules/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/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==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", - "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/unbzip2-stream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", - "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "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" - } - }, - "node_modules/unzipper/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/unzipper/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/unzipper/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vasync": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.0.tgz", - "integrity": "sha1-z951GGChWCLbOxMrxZsRakra8Bs=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "verror": "1.10.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } }, "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==" }, "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -6645,89 +40,89 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", "requires": { - "@babel/types": "^7.14.5", + "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", "requires": { - "@babel/compat-data": "^7.14.5", + "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-plugin-utils": { @@ -6737,36 +132,36 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" }, "@babel/helper-validator-option": { "version": "7.14.5", @@ -6774,70 +169,70 @@ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==" }, "@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" } }, @@ -6892,15 +287,6 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, - "@liradb2000/markdown-it-mermaid": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@liradb2000/markdown-it-mermaid/-/markdown-it-mermaid-0.4.3.tgz", - "integrity": "sha512-ieUUuwqvc4Gr7GxLCu9V6gkW8VIxX/7sjOoByERGxbRFwQGzbVHuMAu6Y63M+umFwcfxU9bE3mSbHEi60a75GQ==", - "requires": { - "mermaid": "^8.10.2", - "npm": "^7.16.0" - } - }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -6937,20 +323,38 @@ "dev": true }, "@types/node": { - "version": "14.14.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.44.tgz", - "integrity": "sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA==" + "version": "14.17.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", + "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==" }, "@types/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", "dev": true, "optional": true, "requires": { "@types/node": "*" } }, + "@wekanteam/cli-table3": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@wekanteam/cli-table3/-/cli-table3-0.7.0.tgz", + "integrity": "sha512-gsd1uXgC5yJSNyPSYKGm7j22ZeCPp6x2VC9QPj+43j6bGtmEtv+qnalooZx5Fey+sR4/pCjXMIQu7hf1N9CTAQ==", + "requires": { + "colors": "^1.1.2", + "string-width": "^4.2.0" + } + }, + "@wekanteam/markdown-it-mermaid": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@wekanteam/markdown-it-mermaid/-/markdown-it-mermaid-0.5.0.tgz", + "integrity": "sha512-rqV55i6jD2itmQjB/klxhtFiAxbANtBvVb3r8FwI62SdFviI61yOCzsSFngrAo6PE5V9YOpNEeiCE5Fe52JsMQ==", + "requires": { + "@wekanteam/cli-table3": "^0.7.0", + "mermaid": "^8.13.3" + } + }, "abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", @@ -6976,6 +380,11 @@ "uri-js": "^4.2.2" } }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -7045,14 +454,18 @@ } }, "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } @@ -7069,20 +482,20 @@ "dev": true }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, @@ -7126,9 +539,9 @@ "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" }, "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==" + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" }, "binary": { "version": "0.3.0", @@ -7192,21 +605,21 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, "bson": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.4.1.tgz", - "integrity": "sha512-Uu4OCZa0jouQJCKOk1EmmyqtdWAP5HVLru4lQxTwzJzxT+sJ13lVpEZU/MATDxtHiekWMAL84oQY3Xn1LpJVSg==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.4.tgz", + "integrity": "sha512-wIt0bPACnx8Ju9r6IsS2wVtGDHBr9Dxb+U29A1YED2pu8XOhS8aKjOnLZ8sxyXkPwanoK7iWWVhS1+coxde6xA==", "requires": { "buffer": "^5.6.0" } @@ -7226,9 +639,9 @@ "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==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof-polyfill": { "version": "1.0.2", @@ -7267,9 +680,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001242", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001242.tgz", - "integrity": "sha512-KvNuZ/duufelMB3w2xtf9gEWCSxJwUgoxOx5b6ScLXC4kPc9xsczUVCPrQU26j5kOsHM4pSUL54tAZt5THQKug==" + "version": "1.0.30001279", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", + "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==" }, "chai": { "version": "4.3.4", @@ -7328,23 +741,24 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "optional": true }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" }, "compress-commons": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.0.tgz", - "integrity": "sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "requires": { "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", + "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", "readable-stream": "^3.6.0" } @@ -7391,72 +805,73 @@ } }, "d3": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", - "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.1.1.tgz", + "integrity": "sha512-8zkLMwSvUAnfN9pcJDfkuxU0Nvg4RLUD0A4BZN1KxJPtlnCGzMx3xM5cRl4m8fym/Vy8rlq52tl90UF3m91OnA==", "requires": { - "d3-array": "1", - "d3-axis": "1", - "d3-brush": "1", - "d3-chord": "1", - "d3-collection": "1", - "d3-color": "1", - "d3-contour": "1", - "d3-dispatch": "1", - "d3-drag": "1", - "d3-dsv": "1", - "d3-ease": "1", - "d3-fetch": "1", - "d3-force": "1", - "d3-format": "1", - "d3-geo": "1", - "d3-hierarchy": "1", - "d3-interpolate": "1", - "d3-path": "1", - "d3-polygon": "1", - "d3-quadtree": "1", - "d3-random": "1", - "d3-scale": "2", - "d3-scale-chromatic": "1", - "d3-selection": "1", - "d3-shape": "1", - "d3-time": "1", - "d3-time-format": "2", - "d3-timer": "1", - "d3-transition": "1", - "d3-voronoi": "1", - "d3-zoom": "1" + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "3", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" } }, "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.1.1.tgz", + "integrity": "sha512-33qQ+ZoZlli19IFiQx4QEpf2CBEayMRzhlisJHSCsSUbDXv6ZishqS1x7uFVClKG4Wr7rZVHvaAttoLow6GqdQ==", + "requires": { + "internmap": "1 - 2" + } }, "d3-axis": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" }, "d3-brush": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", - "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" } }, "d3-chord": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", - "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "requires": { - "d3-array": "1", - "d3-path": "1" + "d3-path": "1 - 3" } }, "d3-collection": { @@ -7465,176 +880,184 @@ "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" }, "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.0.1.tgz", + "integrity": "sha512-6/SlHkDOBLyQSJ1j1Ghs82OIUXpKWlR0hCsw0XrLSQhuUPuCSmLQ1QPH98vpnQxMUQM2/gfAkUEWsupVpd9JGw==" }, "d3-contour": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", - "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-3.0.1.tgz", + "integrity": "sha512-0Oc4D0KyhwhM7ZL0RMnfGycLN7hxHB8CMmwZ3+H26PWAG0ozNuYG5hXSDNgmP1SgJkQMrlG6cP20HoaSbvcJTQ==", "requires": { - "d3-array": "^1.1.1" + "d3-array": "2 - 3" + } + }, + "d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "requires": { + "delaunator": "5" } }, "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" }, "d3-drag": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", - "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "d3-dispatch": "1 - 3", + "d3-selection": "3" } }, "d3-dsv": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", - "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "requires": { - "commander": "2", - "iconv-lite": "0.4", + "commander": "7", + "iconv-lite": "0.6", "rw": "1" } }, "d3-ease": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" }, "d3-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", - "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "requires": { - "d3-dsv": "1" + "d3-dsv": "1 - 3" } }, "d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-hdL7+HBIohpgfolhBxr1KX47VMD6+vVD/oEFrxk5yhmzV2prk99EkFKYpXuhVkFpTgHdJ6/4bYcjdLPPXV4tIA==" }, "d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz", + "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==", "requires": { - "d3-array": "1" + "d3-array": "2.5.0 - 3" } }, "d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.0.1.tgz", + "integrity": "sha512-RlLTaofEoOrMK1JoXYIGhKTkJFI/6rFrYPgxy6QlZo2BcVc4HGTqEU0rPpzuMq5T/5XcMtAzv1XiLA3zRTfygw==" }, "d3-interpolate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", - "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "requires": { - "d3-color": "1" + "d3-color": "1 - 3" } }, "d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" }, "d3-polygon": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" }, "d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" }, "d3-random": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" }, "d3-scale": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", - "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" } }, "d3-scale-chromatic": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", - "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" } }, "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.0.1.tgz", + "integrity": "sha512-HNZNEQoDhuCrDWEc/BMbF/hKtzMZVoe64TvisFLDp2Iyj0UShB/E6/lBsLlJTfBMbYgftHj90cXJ0SEitlE6Xw==", "requires": { - "d3-path": "1" + "d3-path": "1 - 3" } }, "d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } }, "d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-nzaCwlj+ZVBIlFuVOT1RmU+6xb/7D5IcnhHzHQcBgS/aTa5K9fWZNN5LCXA27LgF5WxoSNJqKBbLcGMtM6Ca6A==", "requires": { - "d3-time": "1" + "d3-time": "1 - 3" } }, "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" }, "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", - "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-voronoi": { @@ -7643,15 +1066,15 @@ "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" }, "d3-zoom": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", - "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" } }, "dagre": { @@ -7672,17 +1095,286 @@ "dagre": "^0.8.5", "graphlib": "^2.1.8", "lodash": "^4.17.15" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + } + }, + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz", + "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + } + }, + "d3-color": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz", + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz", + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-geo": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", + "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "requires": { + "d3-array": "1" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", + "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "dayjs": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", - "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { "ms": "2.1.2" } @@ -7696,10 +1388,18 @@ "type-detect": "^4.0.0" } }, + "delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } + }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "detect-libc": { "version": "1.0.3", @@ -7707,9 +1407,9 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "devtools-protocol": { - "version": "0.0.883894", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.883894.tgz", - "integrity": "sha512-33idhm54QJzf3Q7QofMgCvIVSd2o9H3kQPWaKT/fhoZh+digc+WSiMhbkeG3iN79WY4Hwr9G05NpbhEVrsOYAg==", + "version": "0.0.901419", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", + "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", "dev": true }, "diff": { @@ -7719,9 +1419,9 @@ "dev": true }, "dompurify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.0.tgz", - "integrity": "sha512-VV5C6Kr53YVHGOBKO/F86OYX6/iLTw2yVSI721gKetxpHCK/V5TaLEf9ODjRgl1KLSWRMY6cUhAbv/c+IUnwQw==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.3.tgz", + "integrity": "sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg==" }, "dtrace-provider": { "version": "0.8.8", @@ -7770,9 +1470,14 @@ } }, "electron-to-chromium": { - "version": "1.3.768", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.768.tgz", - "integrity": "sha512-I4UMZHhVSK2pwt8jOIxTi3GIuc41NkddtKT/hpuxp9GO5UWJgDKTBa4TACppbVAuKtKbMK6BhQZvT5tFF1bcNA==" + "version": "1.3.894", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.894.tgz", + "integrity": "sha512-WY8pA4irAZ4cm/Pr7YFPtPLVqj3nU6d0SbfoHF6M7HZNONfPdAnYAarumqQ75go2LuN72uO9wGuCEqnfya/ytg==" + }, + "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==" }, "end-of-stream": { "version": "1.4.4", @@ -7787,14 +1492,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" }, - "entity-decode": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/entity-decode/-/entity-decode-2.0.2.tgz", - "integrity": "sha512-5CCY/3ci4MC1m2jlumNjWd7VBFt4VfFnmSqSNmVcXq4gxM3Vmarxtt+SvmBnzwLS669MWdVuXboNVj1qN2esVg==", - "requires": { - "he": "^1.1.1" - } - }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -7817,9 +1514,9 @@ "dev": true }, "exceljs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.1.tgz", - "integrity": "sha512-EogoTdXH1X1PxqD9sV8caYd1RIfXN3PVlCV+mA/87CgdO2h4X5xAEbr7CaiP8tffz7L4aBFwsdMbjfMXi29NjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.3.0.tgz", + "integrity": "sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==", "requires": { "archiver": "^5.0.0", "dayjs": "^1.8.34", @@ -7850,9 +1547,9 @@ } }, "extsprintf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", - "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==" }, "fast-csv": { "version": "4.3.6", @@ -7901,9 +1598,9 @@ } }, "flatted": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.0.tgz", - "integrity": "sha512-XprP7lDrVT+kE2c2YlfiV+IfS9zxukiIOvNamPNsImNhXadSsQEbosItdL9bUQlCZXR13SvPk20BjWSWLA7m4A==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "flushwritable": { @@ -7974,9 +1671,9 @@ } }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7992,9 +1689,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "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.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "graphlib": { "version": "2.1.8", @@ -8006,7 +1703,7 @@ }, "gridfs-stream": { "version": "https://github.com/wekan/gridfs-stream/tarball/master", - "integrity": "sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==", + "integrity": "sha1-LHDhvuPAD0qFNEiT8YnbeXCmV9s= sha512-vGe0SUuTpDFEkHFyEJEheToH4LYyCb0Kvat2iB6xTU6PdiCsKGi3VXkM1cc7Zda4Ulu7Mg1p9OAWG718xll7Fg==", "requires": { "flushwritable": "^1.0.0" } @@ -8029,11 +1726,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -8045,11 +1737,11 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ieee754": { @@ -8076,29 +1768,58 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, + "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==" + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", "dev": true, "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, + "jquery": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", + "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" + }, + "jquery-ui": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.13.0.tgz", + "integrity": "sha512-Osf7ECXNTYHtKBkn9xzbIf9kifNrBhfywFEKxOeB/OVctVmLlouV9mfc2qXCp6uyO4Pn72PXKOnj09qXetopCw==", + "requires": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "jquery-ui-touch-punch": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/jquery-ui-touch-punch/-/jquery-ui-touch-punch-0.2.3.tgz", + "integrity": "sha1-7tgiQnM7okP0az6HwYQbMIGR2mg=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8112,17 +1833,6 @@ "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - } } }, "jsesc": { @@ -8144,9 +1854,9 @@ } }, "jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -8195,9 +1905,9 @@ "integrity": "sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q==" }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "requires": { "readable-stream": "^2.0.5" }, @@ -8240,9 +1950,9 @@ } }, "ldapjs": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.0.tgz", - "integrity": "sha512-3Rbm3CS7vzTccpP1QnzKCEPok60L/b3BFlWU8r93P5oadCAaqCWEH9Td08crPnw4Ti20W8y0+ZKtFFNzxVu4kA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.1.tgz", + "integrity": "sha512-kf0tHHLrpwKaBAQOhYHXgdeh2PkFuCCxWgLb1MRn67ZQVo787D2pij3mmHVZx193GIdM8xcfi8HF6AIYYnj0fQ==", "requires": { "abstract-logging": "^2.0.0", "asn1": "^0.2.4", @@ -8263,9 +1973,9 @@ } }, "linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", "requires": { "uc.micro": "^1.0.1" } @@ -8361,15 +2071,22 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "markdown-it": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.1.0.tgz", - "integrity": "sha512-7temG6IFOOxfU0SgzhqR+vr2diuMhyO5uUIEZ3C5NbXhqC9uFUHoU41USYuDFoZRsaY7BEIEei874Z20VMLF6A==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", "requires": { "argparse": "^2.0.1", "entities": "~2.1.0", "linkify-it": "^3.0.1", "mdurl": "^1.0.1", "uc.micro": "^1.0.5" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + } } }, "markdown-it-emoji": { @@ -8389,50 +2106,50 @@ "optional": true }, "mermaid": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.11.0.tgz", - "integrity": "sha512-c/SprR4mJ2Pj7A+3mEvva7XrhEkXQJUal7fIyOkMhOhsPX2u5gQjjm5CEhHQ6WdGsqP+yiR+Fcgnd1i8mpFK8w==", + "version": "8.13.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.13.3.tgz", + "integrity": "sha512-w6KmDtSzkk856WUVqlBsyLZX0q4Jr35IlxiHTPTaWwMgWHFpI8rEJzcxWoyrpxeT/Rac/vvvSFOZymDTeA0iiA==", "requires": { "@braintree/sanitize-url": "^3.1.0", - "d3": "^5.7.0", - "dagre": "^0.8.4", + "d3": "^7.0.0", + "dagre": "^0.8.5", "dagre-d3": "^0.6.4", - "entity-decode": "^2.0.2", - "graphlib": "^2.1.7", - "khroma": "^1.1.0", - "moment-mini": "^2.22.1", - "stylis": "^3.5.2" + "dompurify": "2.3.3", + "graphlib": "^2.1.8", + "khroma": "^1.4.1", + "moment-mini": "^2.24.0", + "stylis": "^4.0.10" } }, "meteor-node-stubs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.3.tgz", - "integrity": "sha512-JQwIWPfM/Oa2x1Ycwn1Q0wVVQ8b0bOLv+qs4RR/D12b5dPktLlPCRhMzWzRPncZVJtfsnKKBgPLdFmJYUqAwHg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.1.0.tgz", + "integrity": "sha512-YvMQb4zcfWA82wFdRVTyxq28GO+Us7GSdtP+bTtC/mV35yipKnWo4W4665O57AmLVFnz4zR+WIZW11b4sfCtJw==", "requires": { - "assert": "^1.4.1", + "assert": "^2.0.0", "browserify-zlib": "^0.2.0", - "buffer": "^5.2.1", - "console-browserify": "^1.1.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "domain-browser": "^1.2.0", + "domain-browser": "^4.19.0", "elliptic": "^6.5.4", - "events": "^3.0.0", + "events": "^3.3.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "^1.0.0", "process": "^0.11.10", "punycode": "^2.1.1", "querystring-es3": "^0.2.1", - "readable-stream": "^3.3.0", - "stream-browserify": "^2.0.2", - "stream-http": "^3.0.0", - "string_decoder": "^1.2.0", - "timers-browserify": "^2.0.10", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", "tty-browserify": "0.0.1", "url": "^0.11.0", - "util": "^0.11.1", - "vm-browserify": "^1.1.0" + "util": "^0.12.4", + "vm-browserify": "^1.1.2" }, "dependencies": { "asn1.js": { @@ -8452,22 +2169,19 @@ } }, "assert": { - "version": "1.5.0", + "version": "2.0.0", "bundled": true, "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "util": { - "version": "0.10.3", - "bundled": true, - "requires": { - "inherits": "2.0.1" - } - } + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } }, + "available-typed-arrays": { + "version": "1.0.4", + "bundled": true + }, "base64-js": { "version": "1.5.1", "bundled": true @@ -8532,12 +2246,6 @@ "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "browserify-zlib": { @@ -8548,11 +2256,11 @@ } }, "buffer": { - "version": "5.7.1", + "version": "6.0.3", "bundled": true, "requires": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "buffer-xor": { @@ -8563,6 +2271,14 @@ "version": "3.0.0", "bundled": true }, + "call-bind": { + "version": "1.0.2", + "bundled": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "cipher-base": { "version": "1.0.4", "bundled": true, @@ -8579,10 +2295,6 @@ "version": "1.0.0", "bundled": true }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, "create-ecdh": { "version": "4.0.4", "bundled": true, @@ -8637,6 +2349,13 @@ "randomfill": "^1.0.3" } }, + "define-properties": { + "version": "1.1.3", + "bundled": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "des.js": { "version": "1.0.1", "bundled": true, @@ -8661,7 +2380,7 @@ } }, "domain-browser": { - "version": "1.2.0", + "version": "4.19.0", "bundled": true }, "elliptic": { @@ -8680,13 +2399,44 @@ "bn.js": { "version": "4.12.0", "bundled": true - }, - "inherits": { - "version": "2.0.4", - "bundled": true } } }, + "es-abstract": { + "version": "1.18.3", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "bundled": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "bundled": true + }, "events": { "version": "3.3.0", "bundled": true @@ -8699,6 +2449,38 @@ "safe-buffer": "^5.1.1" } }, + "foreach": { + "version": "2.0.5", + "bundled": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true + }, + "get-intrinsic": { + "version": "1.1.1", + "bundled": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "bundled": true + }, + "has-symbols": { + "version": "1.0.2", + "bundled": true + }, "hash-base": { "version": "3.1.0", "bundled": true, @@ -8706,12 +2488,6 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "hash.js": { @@ -8720,12 +2496,6 @@ "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "hmac-drbg": { @@ -8746,13 +2516,85 @@ "bundled": true }, "inherits": { + "version": "2.0.4", + "bundled": true + }, + "is-arguments": { + "version": "1.1.0", + "bundled": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.2", + "bundled": true + }, + "is-boolean-object": { + "version": "1.1.1", + "bundled": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "bundled": true + }, + "is-date-object": { + "version": "1.0.4", + "bundled": true + }, + "is-generator-function": { + "version": "1.0.9", + "bundled": true + }, + "is-nan": { + "version": "1.3.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "is-negative-zero": { "version": "2.0.1", "bundled": true }, - "isarray": { - "version": "1.0.0", + "is-number-object": { + "version": "1.0.5", "bundled": true }, + "is-regex": { + "version": "1.1.3", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "bundled": true + }, + "is-symbol": { + "version": "1.0.4", + "bundled": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, "md5.js": { "version": "1.3.5", "bundled": true, @@ -8784,10 +2626,32 @@ "version": "1.0.1", "bundled": true }, - "object-assign": { - "version": "4.1.1", + "object-inspect": { + "version": "1.10.3", "bundled": true }, + "object-is": { + "version": "1.1.5", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "bundled": true + }, + "object.assign": { + "version": "4.1.2", + "bundled": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "os-browserify": { "version": "0.3.0", "bundled": true @@ -8812,7 +2676,7 @@ "bundled": true }, "pbkdf2": { - "version": "3.1.1", + "version": "3.1.2", "bundled": true, "requires": { "create-hash": "^1.1.2", @@ -8826,10 +2690,6 @@ "version": "0.11.10", "bundled": true }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true - }, "public-encrypt": { "version": "4.0.3", "bundled": true, @@ -8882,12 +2742,6 @@ "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } } }, "ripemd160": { @@ -8919,59 +2773,37 @@ } }, "stream-browserify": { - "version": "2.0.2", + "version": "3.0.0", "bundled": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "bundled": 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" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, "stream-http": { - "version": "3.1.1", + "version": "3.2.0", "bundled": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "bundled": true - } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "bundled": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string_decoder": { @@ -8992,6 +2824,16 @@ "version": "0.0.1", "bundled": true }, + "unbox-primitive": { + "version": "1.0.1", + "bundled": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "url": { "version": "0.11.0", "bundled": true, @@ -9007,16 +2849,15 @@ } }, "util": { - "version": "0.11.1", + "version": "0.12.4", "bundled": true, "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "bundled": true - } + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -9027,6 +2868,30 @@ "version": "1.1.2", "bundled": true }, + "which-boxed-primitive": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.4", + "bundled": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, "xtend": { "version": "4.0.2", "bundled": true @@ -9066,14 +2931,14 @@ "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==" }, "mongodb": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.9.tgz", - "integrity": "sha512-1nSCKgSunzn/CXwgOWgbPHUWOO5OfERcuOWISmqd610jn0s8BU9K4879iJVabqgpPPbA6hO7rG48eq+fGED3Mg==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "optional-require": "^1.0.3", + "optional-require": "^1.1.8", "safe-buffer": "^5.1.2", "saslprep": "^1.0.0" }, @@ -9102,9 +2967,9 @@ } }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "optional": true }, "ncp": { @@ -9144,1850 +3009,19 @@ "dev": true }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "npm": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/npm/-/npm-7.20.3.tgz", - "integrity": "sha512-Kxk+NSnv+bcUKlWEKRaJ745AjEApYzM6GHxXs9AzR8VJiRMPcKvrIGMp+pdkIaF++2kEbcyg/Kx0FCrv+ySJiQ==", - "requires": { - "@npmcli/arborist": "^2.8.0", - "@npmcli/ci-detect": "^1.2.0", - "@npmcli/config": "^2.2.0", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.5", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "archy": "~1.0.0", - "byte-size": "^7.0.1", - "cacache": "^15.2.0", - "chalk": "^4.1.0", - "chownr": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.6.0", - "columnify": "~1.5.4", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "hosted-git-info": "^4.0.2", - "ini": "^2.0.0", - "init-package-json": "^2.0.3", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "leven": "^3.1.0", - "libnpmaccess": "^4.0.2", - "libnpmdiff": "^2.0.4", - "libnpmexec": "^2.0.0", - "libnpmfund": "^1.1.0", - "libnpmhook": "^6.0.2", - "libnpmorg": "^2.0.2", - "libnpmpack": "^2.0.1", - "libnpmpublish": "^4.0.1", - "libnpmsearch": "^3.1.1", - "libnpmteam": "^2.0.3", - "libnpmversion": "^1.2.1", - "make-fetch-happen": "^9.0.4", - "minipass": "^3.1.3", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^7.1.2", - "nopt": "^5.0.0", - "npm-audit-report": "^2.1.5", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.1", - "npm-profile": "^5.0.3", - "npm-registry-fetch": "^11.0.0", - "npm-user-validate": "^1.0.1", - "npmlog": "^5.0.0", - "opener": "^1.5.2", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^3.0.1", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "tar": "^6.1.2", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^1.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^2.0.2", - "write-file-atomic": "^3.0.3" - }, - "dependencies": { - "@npmcli/arborist": { - "version": "2.8.0", - "bundled": true, - "requires": { - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "tar": "^6.1.0", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/ci-detect": { - "version": "1.3.0", - "bundled": true - }, - "@npmcli/config": { - "version": "2.2.0", - "bundled": true, - "requires": { - "ini": "^2.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "semver": "^7.3.4", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/disparity-colors": { - "version": "1.0.1", - "bundled": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/git": { - "version": "2.1.0", - "bundled": true, - "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "bundled": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/map-workspaces": { - "version": "1.0.3", - "bundled": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - } - }, - "@npmcli/metavuln-calculator": { - "version": "1.1.1", - "bundled": true, - "requires": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "bundled": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "bundled": true - }, - "@npmcli/node-gyp": { - "version": "1.0.2", - "bundled": true - }, - "@npmcli/package-json": { - "version": "1.0.1", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "bundled": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "1.8.5", - "bundled": true, - "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "infer-owner": "^1.0.4", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "bundled": true - }, - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.1.4", - "bundled": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "bundled": 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" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true - }, - "aproba": { - "version": "2.0.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asap": { - "version": "2.0.6", - "bundled": true - }, - "asn1": { - "version": "0.2.4", - "bundled": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true - }, - "aws-sign2": { - "version": "0.7.0", - "bundled": true - }, - "aws4": { - "version": "1.11.0", - "bundled": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "bundled": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bin-links": { - "version": "2.2.1", - "bundled": true, - "requires": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtins": { - "version": "1.0.3", - "bundled": true - }, - "byte-size": { - "version": "7.0.1", - "bundled": true - }, - "cacache": { - "version": "15.2.0", - "bundled": true, - "requires": { - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "chalk": { - "version": "4.1.1", - "bundled": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true - }, - "cli-columns": { - "version": "3.1.2", - "bundled": true, - "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "cli-table3": { - "version": "0.6.0", - "bundled": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true - }, - "string-width": { - "version": "4.2.2", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "bundled": true - }, - "cmd-shim": { - "version": "4.1.0", - "bundled": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true - }, - "colors": { - "version": "1.4.0", - "bundled": true, - "optional": true - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "bundled": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.2", - "bundled": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "depd": { - "version": "1.1.2", - "bundled": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.0.0", - "bundled": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "bundled": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true - }, - "extend": { - "version": "3.0.2", - "bundled": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "bundled": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true - }, - "gauge": { - "version": "3.0.1", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.7", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "bundled": true - }, - "har-schema": { - "version": "2.0.0", - "bundled": true - }, - "har-validator": { - "version": "5.1.5", - "bundled": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "bundled": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "4.0.2", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "bundled": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "bundled": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore-walk": { - "version": "3.0.4", - "bundled": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "2.0.0", - "bundled": true - }, - "init-package-json": { - "version": "2.0.3", - "bundled": true, - "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^8.1.2", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^3.0.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - } - }, - "ip": { - "version": "1.1.5", - "bundled": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.5.0", - "bundled": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "bundled": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "bundled": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "just-diff": { - "version": "3.1.1", - "bundled": true - }, - "just-diff-apply": { - "version": "3.0.0", - "bundled": true - }, - "leven": { - "version": "3.1.0", - "bundled": true - }, - "libnpmaccess": { - "version": "4.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmdiff": { - "version": "2.0.4", - "bundled": true, - "requires": { - "@npmcli/disparity-colors": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^3.0.4", - "npm-package-arg": "^8.1.4", - "pacote": "^11.3.4", - "tar": "^6.1.0" - } - }, - "libnpmexec": { - "version": "2.0.0", - "bundled": true, - "requires": { - "@npmcli/arborist": "^2.3.0", - "@npmcli/ci-detect": "^1.3.0", - "@npmcli/run-script": "^1.8.4", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^8.1.2", - "pacote": "^11.3.1", - "proc-log": "^1.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - } - }, - "libnpmfund": { - "version": "1.1.0", - "bundled": true, - "requires": { - "@npmcli/arborist": "^2.5.0" - } - }, - "libnpmhook": { - "version": "6.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmorg": { - "version": "2.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmpack": { - "version": "2.0.1", - "bundled": true, - "requires": { - "@npmcli/run-script": "^1.8.3", - "npm-package-arg": "^8.1.0", - "pacote": "^11.2.6" - } - }, - "libnpmpublish": { - "version": "4.0.2", - "bundled": true, - "requires": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" - } - }, - "libnpmsearch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmteam": { - "version": "2.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmversion": { - "version": "1.2.1", - "bundled": true, - "requires": { - "@npmcli/git": "^2.0.7", - "@npmcli/run-script": "^1.8.4", - "json-parse-even-better-errors": "^2.3.1", - "semver": "^7.3.5", - "stringify-package": "^1.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-fetch-happen": { - "version": "9.0.4", - "bundled": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^5.0.0", - "ssri": "^8.0.0" - } - }, - "mime-db": { - "version": "1.49.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.32", - "bundled": true, - "requires": { - "mime-db": "1.49.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.3", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.3.4", - "bundled": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - } - }, - "ms": { - "version": "2.1.3", - "bundled": true - }, - "mute-stream": { - "version": "0.0.8", - "bundled": true - }, - "negotiator": { - "version": "0.6.2", - "bundled": true - }, - "node-gyp": { - "version": "7.1.2", - "bundled": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "bundled": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.2", - "bundled": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-audit-report": { - "version": "2.1.5", - "bundled": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "1.1.2", - "bundled": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "bundled": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true - }, - "npm-package-arg": { - "version": "8.1.5", - "bundled": true, - "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "2.2.2", - "bundled": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "bundled": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "npm-profile": { - "version": "5.0.4", - "bundled": true, - "requires": { - "npm-registry-fetch": "^11.0.0" - } - }, - "npm-registry-fetch": { - "version": "11.0.0", - "bundled": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.1", - "bundled": true - }, - "npmlog": { - "version": "5.0.0", - "bundled": true, - "requires": { - "are-we-there-yet": "^1.1.5", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "oauth-sign": { - "version": "0.9.0", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "bundled": true - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "11.3.5", - "bundled": true, - "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - } - }, - "parse-conflict-json": { - "version": "1.1.1", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "path-parse": { - "version": "1.0.7", - "bundled": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true - }, - "proc-log": { - "version": "1.0.0", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.1", - "bundled": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true - }, - "promise-call-limit": { - "version": "1.0.1", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "requires": { - "read": "1" - } - }, - "psl": { - "version": "1.8.0", - "bundled": true - }, - "punycode": { - "version": "2.1.1", - "bundled": true - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true - }, - "qs": { - "version": "6.5.2", - "bundled": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "2.0.0", - "bundled": true - }, - "read-package-json": { - "version": "3.0.1", - "bundled": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "bundled": 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" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "bundled": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "request": { - "version": "2.88.2", - "bundled": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "bundled": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "2.5.0", - "bundled": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "resolve": { - "version": "1.20.0", - "bundled": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true - }, - "semver": { - "version": "7.3.5", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.3", - "bundled": true - }, - "smart-buffer": { - "version": "4.1.0", - "bundled": true - }, - "socks": { - "version": "2.6.1", - "bundled": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "requires": { - "agent-base": "6", - "debug": "4", - "socks": "^2.3.3" - } - }, - "spdx-correct": { - "version": "3.1.1", - "bundled": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "bundled": true - }, - "sshpk": { - "version": "1.16.1", - "bundled": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "bundled": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "stringify-package": { - "version": "1.0.1", - "bundled": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.2", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true - }, - "treeverse": { - "version": "1.0.4", - "bundled": true - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "bundled": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "uri-js": { - "version": "4.4.1", - "bundled": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.4.0", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "walk-up-path": { - "version": "1.0.0", - "bundled": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "3.0.3", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, "object-inspect": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" }, "once": { "version": "1.4.0", @@ -10998,14 +3032,17 @@ } }, "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } }, "os": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", - "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" }, "p-limit": { "version": "2.3.0", @@ -11080,6 +3117,11 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -11132,13 +3174,13 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.0.0.tgz", - "integrity": "sha512-AxHvCb9IWmmP3gMW+epxdj92Gglii+6Z4sb+W+zc2hTTu10HF0yg6hGXot5O74uYkVqG3lfDRLfnRpi6WOwi5A==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.4.0.tgz", + "integrity": "sha512-2cP8mBoqnu5gzAVpbZ0fRaobBWZM8GEUF4I1F6WbgHrKV/rz7SX8PG2wMymZgD0wo0UBlg2FBPNxlF/xlqW6+w==", "dev": true, "requires": { "debug": "4.3.1", - "devtools-protocol": "0.0.883894", + "devtools-protocol": "0.0.901419", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.0", "node-fetch": "2.6.1", @@ -11151,6 +3193,15 @@ "ws": "7.4.6" }, "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -11189,9 +3240,14 @@ } }, "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.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" }, "resolve-from": { "version": "5.0.0", @@ -11221,6 +3277,11 @@ } } }, + "robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -11285,13 +3346,13 @@ } }, "sinon": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz", - "integrity": "sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.0", + "@sinonjs/fake-timers": "^7.1.2", "@sinonjs/samsam": "^6.0.2", "diff": "^5.0.0", "nise": "^5.1.0", @@ -11321,9 +3382,9 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11351,6 +3412,16 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11366,10 +3437,18 @@ } } }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz", + "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==" }, "supports-color": { "version": "5.5.0", @@ -11546,17 +3625,29 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "vasync": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.0.tgz", - "integrity": "sha1-z951GGChWCLbOxMrxZsRakra8Bs=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", "requires": { "verror": "1.10.0" + }, + "dependencies": { + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } } }, "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -11572,8 +3663,7 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "requires": {} + "dev": true }, "xmlchars": { "version": "2.2.0", diff --git a/package.json b/package.json index baad51866..4ea9fc8bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wekan", - "version": "v5.47.0", + "version": "v5.85.0", "description": "Open-Source kanban", "private": true, "repository": { @@ -13,16 +13,16 @@ }, "homepage": "https://wekan.github.io", "devDependencies": { - "babel-plugin-istanbul": "^6.0.0", + "babel-plugin-istanbul": "^6.1.1", "chai": "^4.3.4", - "flatted": "^3.2.0", - "puppeteer": "^10.0.0", - "sinon": "^11.1.1" + "flatted": "^3.2.2", + "puppeteer": "^10.2.0", + "sinon": "^11.1.2" }, "dependencies": { - "@babel/core": "^7.14.6", - "@babel/runtime": "^7.14.6", - "@liradb2000/markdown-it-mermaid": "^0.4.3", + "@babel/core": "^7.15.0", + "@babel/runtime": "^7.15.3", + "@wekanteam/markdown-it-mermaid": "^0.5.0", "ajv": "^6.12.6", "babel-runtime": "^6.26.0", "bcryptjs": "^2.4.3", @@ -34,13 +34,16 @@ "exceljs": "^4.2.1", "fibers": "^5.0.0", "gridfs-stream": "https://github.com/wekan/gridfs-stream/tarball/master", - "jszip": "^3.6.0", - "ldapjs": "^2.3.0", - "markdown-it": "^12.1.0", + "jquery": "^2.2.4", + "jquery-ui": "^1.13.0", + "jquery-ui-touch-punch": "^0.2.3", + "jszip": "^3.7.1", + "ldapjs": "^2.3.1", + "markdown-it": "^12.2.0", "markdown-it-emoji": "^2.0.0", - "meteor-node-stubs": "^1.0.3", - "mongodb": "^3.6.9", - "os": "^0.1.1", + "meteor-node-stubs": "^1.1.0", + "mongodb": "^3.6.11", + "os": "^0.1.2", "page": "^1.11.5", "papaparse": "^5.3.1", "qs": "^6.10.1", diff --git a/packages/markdown/src/template-integration.js b/packages/markdown/src/template-integration.js index 1e12ae794..0f4437e74 100755 --- a/packages/markdown/src/template-integration.js +++ b/packages/markdown/src/template-integration.js @@ -7,9 +7,8 @@ var Markdown = require('markdown-it')({ breaks: true, }); -import markdownItMermaid from "@liradb2000/markdown-it-mermaid"; +import markdownItMermaid from "@wekanteam/markdown-it-mermaid"; -/* // Static URL Scheme Listing var urlschemes = [ "aodroplink", @@ -22,40 +21,20 @@ var urlschemes = [ "mailspring" ]; + + // Better would be a field in the admin backend to set this dynamically // instead of putting all known or wanted url schemes here hard into code // but i was not able to access those settings // var urlschemes = currentSetting.automaticLinkedUrlSchemes.split('\n'); + + // put all url schemes into the linkify configuration to automatically make it clickable for(var i=0; i<urlschemes.length;i++){ - //console.log("adding autolink for "+urlschemes[i]); Markdown.linkify.add(urlschemes[i]+":",'http:'); } -// Additional safeAttrValue function to allow for other specific protocols -// See https://github.com/leizongmin/js-xss/issues/52#issuecomment-241354114 -function mySafeAttrValue(tag, name, value, cssFilter) { - // only when the tag is 'a' and attribute is 'href' - // then use your custom function - if (tag === 'a' && name === 'href') { - // only filter the value if starts with an registered url scheme - urlscheme = value.split(/:/); - //console.log("validating "+urlscheme[0]); - if(urlschemes.includes(urlscheme[0])) return value; - else { - // use the default safeAttrValue function to process all non cbthunderlinks - return sanitizeXss.safeAttrValue(tag, name, value, cssFilter); - } -// } else if (tag === 'svg') { -// return `<img src="data:image/svg+xml;base64,` + atob(value) + `"></img>`; - } else { - // use the default safeAttrValue function to process it - return sanitizeXss.safeAttrValue(tag, name, value, cssFilter); - } -}; -*/ - var emoji = require('markdown-it-emoji'); Markdown.use(emoji); Markdown.use(markdownItMermaid); diff --git a/packages/meteor-autosize/LICENSE b/packages/meteor-autosize/LICENSE new file mode 100644 index 000000000..3848fa396 --- /dev/null +++ b/packages/meteor-autosize/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2015 v3rron + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/meteor-autosize/README.md b/packages/meteor-autosize/README.md new file mode 100644 index 000000000..6f477d3b7 --- /dev/null +++ b/packages/meteor-autosize/README.md @@ -0,0 +1,44 @@ +meteor-autosize +====================== + +Ever wondered how to make autoresizable Facebook-style textarea inputs? Autosize is a small, stand-alone script to automatically adjust (resize) textarea height to fit text. +Repackaged for Meteor. + +<img src="./img/ScreenShot1.png" alt="screenshot1" width="360"/> +<img src="./img/ScreenShot2.png" alt="screenshot2" width="360"/> + +## Installation + +`meteor add verron:autosize` + +## Example + +````javascript +// from a NodeList +autosize(document.querySelectorAll('textarea')); + +// from a single Node +autosize(document.querySelector('textarea')); + +// from a jQuery collection +autosize($('textarea')); +```` + +#### Browser compatibility + +Chrome | Firefox | IE | Safari | iOS Safari | Android | Opera Mini | Windows Phone IE +------ | --------|----|--------|------------|---------|------------|------------------ +yes | yes | 9 | yes | yes | 4 | ? | 8.1 + + +#### Documentation and Demo + +http://www.jacklmoore.com/autosize/ + +#### Original package + +https://github.com/jackmoore/autosize/ + +#### Author + +The Meteor repackage was created by Spendflow, updated by Kelly Copley (@copleykj) for the new 0.9.0 packaging system and updated to v3 (pure javascript version) by Ronen Verdi ([@v3rron](https://github.com/v3rron)). diff --git a/packages/meteor-autosize/img/ScreenShot1.png b/packages/meteor-autosize/img/ScreenShot1.png new file mode 100644 index 000000000..637dd0c63 Binary files /dev/null and b/packages/meteor-autosize/img/ScreenShot1.png differ diff --git a/packages/meteor-autosize/img/ScreenShot2.png b/packages/meteor-autosize/img/ScreenShot2.png new file mode 100644 index 000000000..818c8a2bf Binary files /dev/null and b/packages/meteor-autosize/img/ScreenShot2.png differ diff --git a/packages/meteor-autosize/lib/autosize.js b/packages/meteor-autosize/lib/autosize.js new file mode 100755 index 000000000..749e46922 --- /dev/null +++ b/packages/meteor-autosize/lib/autosize.js @@ -0,0 +1,274 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.autosize = factory()); +}(this, (function () { + var map = typeof Map === "function" ? new Map() : function () { + var keys = []; + var values = []; + return { + has: function has(key) { + return keys.indexOf(key) > -1; + }, + get: function get(key) { + return values[keys.indexOf(key)]; + }, + set: function set(key, value) { + if (keys.indexOf(key) === -1) { + keys.push(key); + values.push(value); + } + }, + "delete": function _delete(key) { + var index = keys.indexOf(key); + + if (index > -1) { + keys.splice(index, 1); + values.splice(index, 1); + } + } + }; + }(); + + var createEvent = function createEvent(name) { + return new Event(name, { + bubbles: true + }); + }; + + try { + new Event('test'); + } catch (e) { + // IE does not support `new Event()` + createEvent = function createEvent(name) { + var evt = document.createEvent('Event'); + evt.initEvent(name, true, false); + return evt; + }; + } + + function assign(ta) { + if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return; + var heightOffset = null; + var clientWidth = null; + var cachedHeight = null; + + function init() { + var style = window.getComputedStyle(ta, null); + + if (style.resize === 'vertical') { + ta.style.resize = 'none'; + } else if (style.resize === 'both') { + ta.style.resize = 'horizontal'; + } + + if (style.boxSizing === 'content-box') { + heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); + } else { + heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); + } // Fix when a textarea is not on document body and heightOffset is Not a Number + + + if (isNaN(heightOffset)) { + heightOffset = 0; + } + + update(); + } + + function changeOverflow(value) { + { + // Chrome/Safari-specific fix: + // When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space + // made available by removing the scrollbar. The following forces the necessary text reflow. + var width = ta.style.width; + ta.style.width = '0px'; // Force reflow: + /* jshint ignore:end */ + + ta.style.width = width; + } + ta.style.overflowY = value; + } + + function getParentOverflows(el) { + var arr = []; + + while (el && el.parentNode && el.parentNode instanceof Element) { + if (el.parentNode.scrollTop) { + arr.push({ + node: el.parentNode, + scrollTop: el.parentNode.scrollTop + }); + } + + el = el.parentNode; + } + + return arr; + } + + function resize() { + if (ta.scrollHeight === 0) { + // If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. + return; + } + + var overflows = getParentOverflows(ta); + var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240) + + ta.style.height = ''; + ta.style.height = ta.scrollHeight + heightOffset + 'px'; // used to check if an update is actually necessary on window.resize + + clientWidth = ta.clientWidth; // prevents scroll-position jumping + + overflows.forEach(function (el) { + el.node.scrollTop = el.scrollTop; + }); + + if (docTop) { + document.documentElement.scrollTop = docTop; + } + } + + function update() { + resize(); + var styleHeight = Math.round(parseFloat(ta.style.height)); + var computed = window.getComputedStyle(ta, null); // Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box + + var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight; // The actual height not matching the style height (set via the resize method) indicates that + // the max-height has been exceeded, in which case the overflow should be allowed. + + if (actualHeight < styleHeight) { + if (computed.overflowY === 'hidden') { + changeOverflow('scroll'); + resize(); + actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; + } + } else { + // Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands. + if (computed.overflowY !== 'hidden') { + changeOverflow('hidden'); + resize(); + actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; + } + } + + if (cachedHeight !== actualHeight) { + cachedHeight = actualHeight; + var evt = createEvent('autosize:resized'); + + try { + ta.dispatchEvent(evt); + } catch (err) {// Firefox will throw an error on dispatchEvent for a detached element + // https://bugzilla.mozilla.org/show_bug.cgi?id=889376 + } + } + } + + var pageResize = function pageResize() { + if (ta.clientWidth !== clientWidth) { + update(); + } + }; + + var destroy = function (style) { + window.removeEventListener('resize', pageResize, false); + ta.removeEventListener('input', update, false); + ta.removeEventListener('keyup', update, false); + ta.removeEventListener('autosize:destroy', destroy, false); + ta.removeEventListener('autosize:update', update, false); + Object.keys(style).forEach(function (key) { + ta.style[key] = style[key]; + }); + map["delete"](ta); + }.bind(ta, { + height: ta.style.height, + resize: ta.style.resize, + overflowY: ta.style.overflowY, + overflowX: ta.style.overflowX, + wordWrap: ta.style.wordWrap + }); + + ta.addEventListener('autosize:destroy', destroy, false); // IE9 does not fire onpropertychange or oninput for deletions, + // so binding to onkeyup to catch most of those events. + // There is no way that I know of to detect something like 'cut' in IE9. + + if ('onpropertychange' in ta && 'oninput' in ta) { + ta.addEventListener('keyup', update, false); + } + + window.addEventListener('resize', pageResize, false); + ta.addEventListener('input', update, false); + ta.addEventListener('autosize:update', update, false); + ta.style.overflowX = 'hidden'; + ta.style.wordWrap = 'break-word'; + map.set(ta, { + destroy: destroy, + update: update + }); + init(); + } + + function destroy(ta) { + var methods = map.get(ta); + + if (methods) { + methods.destroy(); + } + } + + function update(ta) { + var methods = map.get(ta); + + if (methods) { + methods.update(); + } + } + + var autosize = null; // Do nothing in Node.js environment and IE8 (or lower) + + if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { + autosize = function autosize(el) { + return el; + }; + + autosize.destroy = function (el) { + return el; + }; + + autosize.update = function (el) { + return el; + }; + } else { + autosize = function autosize(el, options) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], function (x) { + return assign(x); + }); + } + + return el; + }; + + autosize.destroy = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], destroy); + } + + return el; + }; + + autosize.update = function (el) { + if (el) { + Array.prototype.forEach.call(el.length ? el : [el], update); + } + + return el; + }; + } + + var autosize$1 = autosize; + + return autosize$1; + +}))); diff --git a/packages/meteor-autosize/package.js b/packages/meteor-autosize/package.js new file mode 100644 index 000000000..850cfb86f --- /dev/null +++ b/packages/meteor-autosize/package.js @@ -0,0 +1,12 @@ +Package.describe({ + name: 'meteor-autosize', + summary: 'Automatically adjust textarea height based on user input.', + version: '5.0.1', + git: "https://github.com/DeDeSt/meteor-autosize.git", + documentation: 'README.md' +}); + +Package.on_use(function (api) { + api.versionsFrom("METEOR@0.9.0"); + api.add_files(['lib/autosize.js'], 'client'); +}); diff --git a/packages/wekan-ldap/package.js b/packages/wekan-ldap/package.js index b6560854b..b7b4a5d1c 100644 --- a/packages/wekan-ldap/package.js +++ b/packages/wekan-ldap/package.js @@ -26,7 +26,3 @@ Package.onUse(function(api) { api.mainModule('server/index.js', 'server'); }); - -Npm.depends({ - ldapjs: '1.0.2', -}); diff --git a/packages/wekan-request/.gitignore b/packages/wekan-request/.gitignore deleted file mode 100644 index 3c3629e64..000000000 --- a/packages/wekan-request/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/packages/wekan-request/.npmignore b/packages/wekan-request/.npmignore deleted file mode 100644 index 80e59ef52..000000000 --- a/packages/wekan-request/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -tests -node_modules diff --git a/packages/wekan-request/.travis.yml b/packages/wekan-request/.travis.yml deleted file mode 100644 index 0bce81526..000000000 --- a/packages/wekan-request/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - 0.8 - - 0.10 - -env: - - OPTIONALS=Y - - OPTIONALS=N - -install: - - if [[ "$OPTIONALS" == "Y" ]]; then npm install; fi - - if [[ "$OPTIONALS" == "N" ]]; then npm install --no-optional; fi diff --git a/packages/wekan-request/CHANGELOG.md b/packages/wekan-request/CHANGELOG.md deleted file mode 100644 index 11f571f23..000000000 --- a/packages/wekan-request/CHANGELOG.md +++ /dev/null @@ -1,954 +0,0 @@ -## Change Log - -### upcoming (2014/07/09 12:10 +00:00) -- [#946](https://github.com/mikeal/request/pull/946) defaults: merge headers (@aj0strow) -- [#844](https://github.com/mikeal/request/pull/844) Add support for HTTP[S]_PROXY environment variables. Fixes #595. (@jvmccarthy) - -### v2.37.1 (2014/07/07 17:25 +00:00) -- [8711b2f](https://github.com/mikeal/request/commit/8711b2f3489553a7ddae69fa8c9f538182c9d5c8) 2.37.1 (@mikeal) - -### v2.37.0 (2014/07/07 17:25 +00:00) -- [79472b2](https://github.com/mikeal/request/commit/79472b263cde77504a354913a16bdc9fbdc9ed5d) append secureOptions to poolKey (@medovob) -- [#907](https://github.com/mikeal/request/pull/907) append secureOptions to poolKey (@medovob) -- [b223a8a](https://github.com/mikeal/request/commit/b223a8add0cbdd4e699a52da66aeb0f0cb17a0c3) expose tough-cookie's getCookiesSync (@charlespwd) -- [f4dcad0](https://github.com/mikeal/request/commit/f4dcad0fa6e2f2388abae508ad7256a1e1214ab2) test getCookies method (@charlespwd) -- [adcf62b](https://github.com/mikeal/request/commit/adcf62bf45ec19a28198ca8d3f37e7d7babc883a) update readme (@charlespwd) -- [4fdf13b](https://github.com/mikeal/request/commit/4fdf13b57dcd20b9fe03c0956f5df70c82d6e4a3) Merge branch 'charlespwd-master' (@lalitkapoor) -- [83e370d](https://github.com/mikeal/request/commit/83e370d54ca2a5fb162e40e7e705e1e9d702ba0a) Bump version of hawk dep. (@samccone) -- [#927](https://github.com/mikeal/request/pull/927) Bump version of hawk dep. (@samccone) -- [c42dcec](https://github.com/mikeal/request/commit/c42dcec10a307cb2299861f87720d491a89142b4) package.json: use OSI-style license name (@isaacs) -- [8892cb7](https://github.com/mikeal/request/commit/8892cb7bb8945807ff25038e888222d4e902acc8) Swap mime module. (@eiriksm) -- [d92395e](https://github.com/mikeal/request/commit/d92395e638cbfe5c31eb4ff54941b98b09057486) Make package.json so node .8 understands it. (@eiriksm) -- [6ebd748](https://github.com/mikeal/request/commit/6ebd748a02a49976d41ebbc4f8396acf8fda1c14) Add some additional hacks to work in the browser. (@eiriksm) -- [#943](https://github.com/mikeal/request/pull/943) New mime module (@eiriksm) -- [561454d](https://github.com/mikeal/request/commit/561454d18a68b7a03163308f6d29e127afe97426) Add some code comments about why we do the extra checks. (@eiriksm) -- [#944](https://github.com/mikeal/request/pull/944) Make request work with browserify (@eiriksm) -- [6a0add7](https://github.com/mikeal/request/commit/6a0add70b2687cf751b3446a15a513a1fd141738) defaults: merge headers (@aj0strow) -- [407c1ad](https://github.com/mikeal/request/commit/407c1ada61afca4d4ba50155c6d9430754541df1) prefer late return statement (@aj0strow) -- [4ab40ba](https://github.com/mikeal/request/commit/4ab40ba2f9aca8958cab149eb9cfbd9edb5534aa) Added support for manual querystring in form option (@charlespwd) -- [a55627c](https://github.com/mikeal/request/commit/a55627cd9f468cefb2971bb501ebc0c2fc27aa8b) Updated README (@charlespwd) -- [#949](https://github.com/mikeal/request/pull/949) Manually enter querystring in form option (@charlespwd) -- [10246c8](https://github.com/mikeal/request/commit/10246c84819db14b32fccca040029b06449242a3) [PATCH v2] Add support for gzip content decoding (@kevinoid) -- [6180c5f](https://github.com/mikeal/request/commit/6180c5f45c01fb2158b9a44f894a34263479fa84) check for content-length header before setting it in nextTick (@camilleanne) -- [#951](https://github.com/mikeal/request/pull/951) Add support for gzip content decoding (@kevinoid) -- [849c681](https://github.com/mikeal/request/commit/849c681846ce3b5492bd47261de391377a3ac19b) Silence EventEmitter memory leak warning #311 (@watson) -- [#955](https://github.com/mikeal/request/pull/955) check for content-length header before setting it in nextTick (@camilleanne) -- [#957](https://github.com/mikeal/request/pull/957) Silence EventEmitter memory leak warning #311 (@watson) -- [c1d951e](https://github.com/mikeal/request/commit/c1d951e536bd41c957f0cade41d051c9d41d1462) Fixing for 0.8 (@mikeal) -- [4851118](https://github.com/mikeal/request/commit/48511186495888a5f0cb15a107325001ac91990e) 2.37.0 (@mikeal) - -### v2.36.1 (2014/05/19 20:59 +00:00) -- [c3914fc](https://github.com/mikeal/request/commit/c3914fcd4a74faf6dbf0fb6a4a188e871e0c51b8) 2.36.1 (@mikeal) - -### v2.36.0 (2014/05/19 20:59 +00:00) -- [76a96de](https://github.com/mikeal/request/commit/76a96de75580042aa780e9587ff7a22522119c3f) Reventing lodash merge change. (@mikeal) -- [b8bb57e](https://github.com/mikeal/request/commit/b8bb57efb17e72e2ac6d957c05c3f2570c7ba6a0) 2.36.0 (@mikeal) - -### v2.35.1 (2014/05/17 20:57 +00:00) -- [4bbd153](https://github.com/mikeal/request/commit/4bbd1532a68cadf1a88dd69c277645e9b781f364) 2.35.1 (@mikeal) - -### v2.35.0 (2014/05/17 20:57 +00:00) -- [2833da3](https://github.com/mikeal/request/commit/2833da3c3c1c34f4130ad1ba470354fc32410691) initial changelog (@lalitkapoor) -- [49319e6](https://github.com/mikeal/request/commit/49319e6c09a8a169c95a8d282c900f9fecd50371) Merge branch 'master' of https://github.com/mikeal/request into create-changelog-based-on-pull-requests (@lalitkapoor) -- [#815](https://github.com/mikeal/request/pull/815) Create changelog based on pull requests (@lalitkapoor) -- [4b6ce1a](https://github.com/mikeal/request/commit/4b6ce1ac0f79cb8fa633e281d3eb4c0cb61794e1) It appears that secureOptions is an undocumented feature to fix issues with broken server. See joynet/node #5119 (@nw) -- [#821](https://github.com/mikeal/request/pull/821) added secureOptions back (@nw) -- [eddd488](https://github.com/mikeal/request/commit/eddd4889fb1bc95c741749e79d9749aab3e103fc) Fixing #825 (@mikeal) -- [4627a7a](https://github.com/mikeal/request/commit/4627a7a14078494ded8c66c19c43efd07324cbd8) improve error reporting for invalid protocols (@FND) -- [#840](https://github.com/mikeal/request/pull/840) improve error reporting for invalid protocols (@FND) -- [#810](https://github.com/mikeal/request/pull/810) add some exposition to mpu example in README.md (@mikermcneil) -- [8a0e2d6](https://github.com/mikeal/request/commit/8a0e2d65351560858275c73505df12b537f4d001) Added support for HTTP_PROXY and HTTPS_PROXY environment variables, if the proxy option isn't already set. (@jvmccarthy) -- [f60d348](https://github.com/mikeal/request/commit/f60d348dc1840ee6d7b709efcc2b3cd1a03aef63) Fix word consistency -- [#850](https://github.com/mikeal/request/pull/850) Fix word consistency in readme (@0xNobody) -- [#809](https://github.com/mikeal/request/pull/809) upgrade tunnel-proxy to 0.4.0 (@ksato9700) -- [e86377c](https://github.com/mikeal/request/commit/e86377c0c1e7695c3997f7802175ca37f5a5113b) Won't use HTTP(S)_PROXY env var if proxy explicitly set to null. (@jvmccarthy) -- [f1bb537](https://github.com/mikeal/request/commit/f1bb537ee2440bd664ea8c445ac3a2c6e31e9932) Add support for RFC 6750 Bearer Tokens -- [ba51a26](https://github.com/mikeal/request/commit/ba51a26079ec52c0a9145fbe8b6796d46e79bb8e) Add documentation about auth.bearer (@phedny) -- [#861](https://github.com/mikeal/request/pull/861) Add support for RFC 6750 Bearer Tokens (@phedny) -- [b8ee579](https://github.com/mikeal/request/commit/b8ee5790ace95440a56074f6afe866f4662e9e88) Fix typo (@dandv) -- [#866](https://github.com/mikeal/request/pull/866) Fix typo (@dandv) -- [b292b59](https://github.com/mikeal/request/commit/b292b59fadecb35dac3bee0959c4b4b782e772e3) Clean code syntax in test-pipes.js (@tgohn) -- [f7996d5](https://github.com/mikeal/request/commit/f7996d5fcfed85e03f293a7c9739e385b64ecaad) Add test for request.pipefilter (@tgohn) -- [#869](https://github.com/mikeal/request/pull/869) Pipefilter test (@tgohn) -- [86b99b6](https://github.com/mikeal/request/commit/86b99b671a3c86f4f963a6c67047343fd8edae8f) Fix typo in form example (@mscdex) -- [2ba4808](https://github.com/mikeal/request/commit/2ba48083ddf2607f85e2c479e0d254483c2610fe) failing test (@lalitkapoor) -- [39396b0](https://github.com/mikeal/request/commit/39396b0bb2e90eb7ec4dfcf5d2e731a2cb156f5c) extend passed in options (@lalitkapoor) -- [#891](https://github.com/mikeal/request/pull/891) fixes 857 - options object is mutated by calling request (@lalitkapoor) -- [54a51c6](https://github.com/mikeal/request/commit/54a51c665887e162ccb9f6b17b9c1f3b017ccc29) merge options (@vohof) -- [25b95db](https://github.com/mikeal/request/commit/25b95dbdddf874f014386a0a9fe35a7c903b7415) tilde? (@vohof) -- [#897](https://github.com/mikeal/request/pull/897) merge with default options (@vohof) -- [a1e4b1a](https://github.com/mikeal/request/commit/a1e4b1a9c2f39ce565fd023bb604da139f689d43) Fixes #555 (@pigulla) -- [#901](https://github.com/mikeal/request/pull/901) Fixes #555 (@pigulla) -- [6498a5f](https://github.com/mikeal/request/commit/6498a5f1ae68050cfeabf8f34f75bc72b08f1805) 2.35.0 (@mikeal) - -### v2.34.1 (2014/02/18 19:35 +00:00) -- [aefea20](https://github.com/mikeal/request/commit/aefea20b215ff1a48f0d8d27dcac0186604e3b2d) 2.34.1 (@mikeal) - -### v2.34.0 (2014/02/18 19:35 +00:00) -- [46edc90](https://github.com/mikeal/request/commit/46edc902e6ffdee39038a6702021728cb9d9b8fa) simpler (@joaojeronimo) -- [#781](https://github.com/mikeal/request/pull/781) simpler isReadStream function (@joaojeronimo) -- [fe2f59f](https://github.com/mikeal/request/commit/fe2f59fdc72de5c86404e51ab6bc4e0e8ece95f2) Provide ability to override content-type when `json` option used (@vvo) -- [#785](https://github.com/mikeal/request/pull/785) Provide ability to override content-type when `json` option used (@vvo) -- [d134f01](https://github.com/mikeal/request/commit/d134f012e64702e8f4070d61504b39524e1a07ba) Adds content-length calculation when submitting forms using form-data library. This is related to issue 345. (@Juul) -- [#793](https://github.com/mikeal/request/pull/793) Adds content-length calculation when submitting forms using form-data li... (@Juul) -- [3ebf25c](https://github.com/mikeal/request/commit/3ebf25c5af1194d8f7b3a3330fe89e729532809b) adding failing test (@lalitkapoor) -- [0f57a90](https://github.com/mikeal/request/commit/0f57a90384588727a5446bb1f5bf4e0be2d85780) accept options in arguments (@lalitkapoor) -- [7fb1647](https://github.com/mikeal/request/commit/7fb164731a5aad80c6539e33eda4ad4a51bb7871) silently ignore errors when adding cookie to jar (@lalitkapoor) -- [d6b2b1c](https://github.com/mikeal/request/commit/d6b2b1c279d12cdddc6593060672d49b12e63fea) add additional header test (@lalitkapoor) -- [f29e6df](https://github.com/mikeal/request/commit/f29e6dfadc6c3a45b6190998b6608059f87f3c32) Added the Apache license to the package.json. (@keskival) -- [#802](https://github.com/mikeal/request/pull/802) Added the Apache license to the package.json. (@keskival) -- [#801](https://github.com/mikeal/request/pull/801) 794 ignore cookie parsing and domain errors (@lalitkapoor) -- [54e6dfb](https://github.com/mikeal/request/commit/54e6dfb77d57757d4006982f813ebaab9e005cd5) Rewrite UNIX Domain Socket support into 2.33.1. Add test. (@lyuzashi) -- [3eaed2f](https://github.com/mikeal/request/commit/3eaed2f2e82d9d17a583bcc54270c16a7b674206) Use setImmediate when available, otherwise fallback to nextTick (@lyuzashi) -- [746ca75](https://github.com/mikeal/request/commit/746ca757da24d5011e92e04cb00c90098a7680fd) Indent wrapped buildRequest function (@lyuzashi) -- [#516](https://github.com/mikeal/request/pull/516) UNIX Socket URL Support (@native-digital) -- [9a5b0a8](https://github.com/mikeal/request/commit/9a5b0a81eca9836f05b0192c05c0d41e79034461) initial format (@lalitkapoor) -- [9380a49](https://github.com/mikeal/request/commit/9380a49779ddb081eba5d0ee51e4396d72d52066) upgrade tunnel-proxy to 0.4.0 (@ksato9700) -- [1efea37](https://github.com/mikeal/request/commit/1efea374286c728c3c988ee2264fb44cd8c41d88) add some exposition to mpu example in README.md (@mikermcneil) -- [ba0d63a](https://github.com/mikeal/request/commit/ba0d63ae23a3fc95dfe012df0bd6c8d7e87b1df7) made the language clearer (@mikermcneil) -- [b43aa81](https://github.com/mikeal/request/commit/b43aa81789c0b8c7ae90d2b983f79dde4a125470) 2.34.0 (@mikeal) - -### v2.33.1 (2014/01/16 19:48 +00:00) -- [afcf827](https://github.com/mikeal/request/commit/afcf827559b3223c96ac1bbd19bd1e4a6d7771e3) 2.33.1 (@mikeal) - -### v2.33.0 (2014/01/16 19:48 +00:00) -- [7f1cc8f](https://github.com/mikeal/request/commit/7f1cc8ff5a8d9443e7a793f4655487e722b75b0d) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [3e43d3d](https://github.com/mikeal/request/commit/3e43d3d5175f5f18d1e97b2f5d4ca6ac6c216e4a) 2.33.0 (@mikeal) - -### v2.32.1 (2014/01/16 19:33 +00:00) -- [dd44f39](https://github.com/mikeal/request/commit/dd44f39d37daacbbeb21f9e960f13adbb44eea0a) 2.32.1 (@mikeal) - -### v2.32.0 (2014/01/16 19:33 +00:00) -- [#757](https://github.com/mikeal/request/pull/757) require aws-sign2 (@mafintosh) -- [#744](https://github.com/mikeal/request/pull/744) Use Cookie.parse (@lalitkapoor) -- [5eaee1c](https://github.com/mikeal/request/commit/5eaee1ce4008ede1df15201622ac478c892d6a8a) Upgrade tough-cookie to 0.10.0 (@stash) -- [#763](https://github.com/mikeal/request/pull/763) Upgrade tough-cookie to 0.10.0 (@stash) -- [d2489d0](https://github.com/mikeal/request/commit/d2489d0e24d9a538224f5c8c090dcdeb1f8d4969) Fixed auth error for some servers like twisted. According to rfc 2617 auth scheme token should be case-insensitive. (@bobyrizov) -- [#764](https://github.com/mikeal/request/pull/764) Case-insensitive authentication scheme (@bobyrizov) -- [cbee3d0](https://github.com/mikeal/request/commit/cbee3d04ee9f704501a64edb7b9b6d201e98494b) Use tough-cookie CookieJar sync API (@stash) -- [3eeaf6a](https://github.com/mikeal/request/commit/3eeaf6a90df7b806d91ae1e8e2f56862ece2ea33) Emit error, not cookieError (@stash) -- [#767](https://github.com/mikeal/request/pull/767) Use tough-cookie CookieJar sync API (@stash) -- [9eac534](https://github.com/mikeal/request/commit/9eac534dd11e40bba65456491cb62ad68d8f41fa) 2.32.0 (@mikeal) - -### v2.31.1 (2014/01/08 02:57 +00:00) -- [b1b5e91](https://github.com/mikeal/request/commit/b1b5e9161e149574ba5528c401a70bfadef1a98a) 2.31.1 (@mikeal) - -### v2.31.0 (2014/01/08 02:57 +00:00) -- [dd2577f](https://github.com/mikeal/request/commit/dd2577f8264d4d4b07484dec7094b72c00c8416f) Removing s3 test. (@mikeal) -- [fef5bf3](https://github.com/mikeal/request/commit/fef5bf34258e3695b61c048c683f1d4a7f99b368) Fix callback arguments documentation (@mmalecki) -- [#736](https://github.com/mikeal/request/pull/736) Fix callback arguments documentation (@mmalecki) -- [5531c20](https://github.com/mikeal/request/commit/5531c208678145ef35b06e948190be2fd6a8a1c8) updating README example: cookie jar api changed cookie module changed to tough-cookie (@emkay) -- [#741](https://github.com/mikeal/request/pull/741) README example is using old cookie jar api (@emkay) -- [9d73e5a](https://github.com/mikeal/request/commit/9d73e5a277af141a6e4fa9dbcae5d0c3b755d277) add note about JSON output body type (@iansltx) -- [#742](https://github.com/mikeal/request/pull/742) Add note about JSON output body type (@iansltx) -- [41e20a4](https://github.com/mikeal/request/commit/41e20a4d288e30101e493b383a0e4852a3271a98) Use Cookie.parse (@lalitkapoor) -- [4d09556](https://github.com/mikeal/request/commit/4d095562a5c42ffb41b0ff194e9e6f32c0f44372) updating setCookie example to make it clear that the callback is required (@emkay) -- [#745](https://github.com/mikeal/request/pull/745) updating setCookie example to make it clear that the callback is required (@emkay) -- [b7ede1d](https://github.com/mikeal/request/commit/b7ede1d56f9a2764e4bf764687b81419df817e5a) README: Markdown code highlight (@weakish) -- [#746](https://github.com/mikeal/request/pull/746) README: Markdown code highlight (@weakish) -- [#645](https://github.com/mikeal/request/pull/645) update twitter api url to v1.1 (@mick) -- [20dcd18](https://github.com/mikeal/request/commit/20dcd18ce8e3397ba7e0213da9c760b048ca5b49) require aws-sign2 (@mafintosh) -- [df2c426](https://github.com/mikeal/request/commit/df2c4264321c3db1387ddf9a945d63b9ae7d57b8) 2.31.0 (@mikeal) - -### v2.30.1 (2013/12/13 19:17 +00:00) -- [eba2d40](https://github.com/mikeal/request/commit/eba2d402fcdcf1ac878de8672b1c9f5da856dcc1) 2.30.1 (@mikeal) - -### v2.30.0 (2013/12/13 19:17 +00:00) -- [aee3819](https://github.com/mikeal/request/commit/aee38191557574ef570fd9c764af0af7072cc92a) Fix TypeError when calling request.cookie -- [#728](https://github.com/mikeal/request/pull/728) Fix TypeError when calling request.cookie (@scarletmeow) -- [628ef76](https://github.com/mikeal/request/commit/628ef768b1f52710b8eb4e14be4db69d174d1dcb) better DIGEST support (@dai-shi) -- [d919bc1](https://github.com/mikeal/request/commit/d919bc1ce97fa461c365437a0c739bbaa6b86de7) ignore null authValues (DIGEST) (@dai-shi) -- [75fc209](https://github.com/mikeal/request/commit/75fc209c5a9e6c647a04e42048c30f46c66fc103) DIGEST support: pass algoritm and opaque, add TODO items, test case for compatible mode (@dai-shi) -- [#730](https://github.com/mikeal/request/pull/730) better HTTP DIGEST support (@dai-shi) -- [937a24a](https://github.com/mikeal/request/commit/937a24a168a126f406ee8eb55eb78169ddc53497) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. -- [#732](https://github.com/mikeal/request/pull/732) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. (@Fritz-Lium) -- [f03be23](https://github.com/mikeal/request/commit/f03be2309bd85a89d2e3c208b2fb4be1a2b95c79) Make digest qop regex more robust (see #730) (@nylen) -- [c7d97ae](https://github.com/mikeal/request/commit/c7d97aefaebf773ce62c72e9ec656f0250b7a1e7) 2.30.0 (@mikeal) - -### v2.29.1 (2013/12/06 20:05 +00:00) -- [e0f2c41](https://github.com/mikeal/request/commit/e0f2c41bd4e15518e97dd2f4c134be51ed4cb68b) 2.29.1 (@mikeal) - -### v2.29.0 (2013/12/06 20:05 +00:00) -- [3c2cad1](https://github.com/mikeal/request/commit/3c2cad11301380f4056eb3ca4c0c124f7f7f72f5) make request.defaults(options, requester) run the requester for all methods (@jchris) -- [#727](https://github.com/mikeal/request/pull/727) fix requester bug (@jchris) -- [0c9f875](https://github.com/mikeal/request/commit/0c9f87542cd1f919751d3ed1f00208ce7705f8e7) 2.29.0 (@mikeal) - -### v2.28.1 (2013/12/04 19:42 +00:00) -- [3e6a300](https://github.com/mikeal/request/commit/3e6a300121586da81b871f759a9feec52810474a) 2.28.1 (@mikeal) - -### v2.28.0 (2013/12/04 19:42 +00:00) -- [ac26f43](https://github.com/mikeal/request/commit/ac26f43d9a8212289f92056d3029c207f755cef4) Update request.js (@wprl) -- [adc2cb6](https://github.com/mikeal/request/commit/adc2cb6721e5980e8ed667a3f558cce8c89ee6c2) Use random cnonce (@wprl) -- [ff16a9d](https://github.com/mikeal/request/commit/ff16a9daf93e01cecee7fabec64c3e1b423f7db5) Add test for random cnonce (@wprl) -- [df64c2b](https://github.com/mikeal/request/commit/df64c2bc8f691ecc6f6c214e2254bab439830b88) Restore whitespace (@wprl) -- [#630](https://github.com/mikeal/request/pull/630) Send random cnonce for HTTP Digest requests (@wprl) -- [aca5a16](https://github.com/mikeal/request/commit/aca5a169c44cc658e8310691a2ae1cfc4c2b0958) update twitter api url to v1.1 (@mick) -- [abcbadd](https://github.com/mikeal/request/commit/abcbadd1b2a113c34a37b62d36ddcfd74452850e) Test case for #304. (@diversario) -- [b8cf874](https://github.com/mikeal/request/commit/b8cf8743b66d8eee4048561a7d81659f053393c8) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) -- [e6c7d1f](https://github.com/mikeal/request/commit/e6c7d1f6d23922480c09427d5f54f84eec60b7af) quiet, but check that stderr output has something reasonable for debug (@jrgm) -- [#659](https://github.com/mikeal/request/pull/659) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) -- [23164e4](https://github.com/mikeal/request/commit/23164e4f33bd0837d796037c3d0121db23653c34) option.tunnel to explicitly disable tunneling (@seanmonstar) -- [#662](https://github.com/mikeal/request/pull/662) option.tunnel to explicitly disable tunneling (@seanmonstar) -- [#656](https://github.com/mikeal/request/pull/656) Test case for #304. (@diversario) -- [da16120](https://github.com/mikeal/request/commit/da16120a8f0751b305a341c012dbdcfd62e83585) Change `secureOptions' to `secureProtocol' for HTTPS request (@richarddong) -- [43d9d0a](https://github.com/mikeal/request/commit/43d9d0a76974d2c61681ddee04479d514ebfa320) add `ciphers' and `secureProtocol' to `options' in `getAgent' (@richarddong) -- [#666](https://github.com/mikeal/request/pull/666) make `ciphers` and `secureProtocol` to work in https request (@richarddong) -- [524e035](https://github.com/mikeal/request/commit/524e0356b73240409a11989d369511419526b5ed) change cookie module (@sxyizhiren) -- [#674](https://github.com/mikeal/request/pull/674) change cookie module,to tough-cookie.please check it . (@sxyizhiren) -- [e8dbcc8](https://github.com/mikeal/request/commit/e8dbcc83d4eff3c14e03bd754174e2c5d45f2872) tests: Fixed test-timeout.js events unit test (@Turbo87) -- [aed1c71](https://github.com/mikeal/request/commit/aed1c71fac0047b66a236a990a5569445cfe995d) Added Travis CI configuration file (@Turbo87) -- [#683](https://github.com/mikeal/request/pull/683) Travis CI support (@Turbo87) -- [8bfa640](https://github.com/mikeal/request/commit/8bfa6403ce03cbd3f3de6b82388bfcc314e56c61) dependencies: Set `tough-cookie` as optional dependency (@Turbo87) -- [bcc138d](https://github.com/mikeal/request/commit/bcc138da67b7e1cf29dc7d264a73d8b1d1f4b0e4) dependencies: Set `form-data` as optional dependency (@Turbo87) -- [751ac28](https://github.com/mikeal/request/commit/751ac28b7f13bfeff2a0e920ca2926a005dcb6f0) dependencies: Set `tunnel-agent` as optional dependency (@Turbo87) -- [6d7c1c9](https://github.com/mikeal/request/commit/6d7c1c9d8e3a300ff6f2a93e7f3361799acf716b) dependencies: Set `http-signature` as optional dependency (@Turbo87) -- [733f1e3](https://github.com/mikeal/request/commit/733f1e3ae042a513a18cde1c6e444b18ee07ad66) Added .npmignore file (@Turbo87) -- [e2fc346](https://github.com/mikeal/request/commit/e2fc346b7e5e470fcd36189bcadf63c53feebb22) dependencies: Set `hawk` as optional dependency (@Turbo87) -- [e87d45f](https://github.com/mikeal/request/commit/e87d45fe89ea220035bf07696a70292763f7135f) dependencies: Set `aws-sign` as optional dependency (@Turbo87) -- [1cd81ba](https://github.com/mikeal/request/commit/1cd81ba30908b77cff2fa618aeb232fefaa53ada) lib: Added optional() function (@Turbo87) -- [28c2c38](https://github.com/mikeal/request/commit/28c2c3820feab0cc719df213a60838db019f3e1a) dependencies: Set `oauth-sign` as optional dependency (@Turbo87) -- [2ceddf7](https://github.com/mikeal/request/commit/2ceddf7e793feb99c5b6a76998efe238965b22cd) TravisCI: Test with and without optional dependencies (@Turbo87) -- [#682](https://github.com/mikeal/request/pull/682) Optional dependencies (@Turbo87) -- [2afab5b](https://github.com/mikeal/request/commit/2afab5b665a2e03becbc4a42ad481bb737405655) Handle blank password in basic auth. (@diversario) -- [cabe5a6](https://github.com/mikeal/request/commit/cabe5a62dc71282ce8725672184efe9d97ba79a5) Handle `auth.password` and `auth.username`. (@diversario) -- [#690](https://github.com/mikeal/request/pull/690) Handle blank password in basic auth. (@diversario) -- [33100c3](https://github.com/mikeal/request/commit/33100c3c7fa678f592374f7b2526fe9a0499b6f6) Typo (@VRMink) -- [#694](https://github.com/mikeal/request/pull/694) Typo in README (@ExxKA) -- [9072ff1](https://github.com/mikeal/request/commit/9072ff1556bcb002772838a94e1541585ef68f02) Edited README.md for formatting and clarity of phrasing (@Zearin) -- [#696](https://github.com/mikeal/request/pull/696) Edited README.md for formatting and clarity of phrasing (@Zearin) -- [07ee58d](https://github.com/mikeal/request/commit/07ee58d3a8145740ba34cc724f123518e4b3d1c3) Fixing listing in callback part of docs. (@lukasz-zak) -- [#710](https://github.com/mikeal/request/pull/710) Fixing listing in callback part of docs. (@lukasz-zak) -- [8ee21d0](https://github.com/mikeal/request/commit/8ee21d0dcc637090f98251eba22b9f4fd1602f0e) Request.multipart no longer crashes when header 'Content-type' is present (@pastaclub) -- [#715](https://github.com/mikeal/request/pull/715) Request.multipart no longer crashes when header 'Content-type' present (@pastaclub) -- [8b04ca6](https://github.com/mikeal/request/commit/8b04ca6ad8d025c275e40b806a69112ac53bd416) doc: Removed use of gendered pronouns (@oztu) -- [#719](https://github.com/mikeal/request/pull/719) Made a comment gender neutral. (@oztu) -- [8795fc6](https://github.com/mikeal/request/commit/8795fc68cce26b9a45d10db9eaffd4bc943aca3a) README.md: add custom HTTP Headers example. (@tcort) -- [#724](https://github.com/mikeal/request/pull/724) README.md: add custom HTTP Headers example. (@tcort) -- [c5d5b1f](https://github.com/mikeal/request/commit/c5d5b1fcf348e768943fe632a9a313d704d35c65) Changing dep. (@mikeal) -- [bf04163](https://github.com/mikeal/request/commit/bf04163883fa9c62d4e1a9fdd64d6efd7723d5f8) 2.28.0 (@mikeal) - -### v2.27.1 (2013/08/15 21:30 +00:00) -- [a80a026](https://github.com/mikeal/request/commit/a80a026e362a9462d6948adc1b0d2831432147d2) 2.27.1 (@mikeal) - -### v2.27.0 (2013/08/15 21:30 +00:00) -- [3627b9c](https://github.com/mikeal/request/commit/3627b9cc7752cfe57ac609ed613509ff61017045) rename Request and remove .DS_Store (@joaojeronimo) -- [920f9b8](https://github.com/mikeal/request/commit/920f9b88f7dd8f8d153e72371b1bf2d16d5e4160) rename Request (@joaojeronimo) -- [c243cc6](https://github.com/mikeal/request/commit/c243cc66131216bb57bcc0fd79c250a7927ee424) for some reason it removed request.js (@joaojeronimo) -- [#619](https://github.com/mikeal/request/pull/619) decouple things a bit (@CrowdProcess) -- [ed4ecc5](https://github.com/mikeal/request/commit/ed4ecc5ae5cd1d9559a937e84638c9234244878b) Try normal stringify first, then fall back to safe stringify (@mikeal) -- [5642ff5](https://github.com/mikeal/request/commit/5642ff56e64c19e8183dcd5b6f9d07cca295a79e) 2.27.0 (@mikeal) - -### v2.26.1 (2013/08/07 16:31 +00:00) -- [b422510](https://github.com/mikeal/request/commit/b422510ba16315c3e0e1293a17f3a8fa7a653a77) 2.26.1 (@mikeal) - -### v2.26.0 (2013/08/07 16:31 +00:00) -- [3b5b62c](https://github.com/mikeal/request/commit/3b5b62cdd4f3b92e63a65d3a7265f5a85b11c4c9) Only include :password in Basic Auth if it's defined (fixes #602) (@bendrucker) -- [#605](https://github.com/mikeal/request/pull/605) Only include ":" + pass in Basic Auth if it's defined (fixes #602) (@bendrucker) -- [cce2c2c](https://github.com/mikeal/request/commit/cce2c2c8ea5b0136932b2432e4e25c0124d58d5a) Moved init of self.uri.pathname (@lexander) -- [08793ec](https://github.com/mikeal/request/commit/08793ec2f266ef88fbe6c947e6b334e04d4b9dc9) Fix all header casing issues forever. (@mikeal) -- [#613](https://github.com/mikeal/request/pull/613) Fixes #583, moved initialization of self.uri.pathname (@lexander) -- [f98ff99](https://github.com/mikeal/request/commit/f98ff990d294165498c9fbf79b2de12722e5c842) Update this old ass readme with some new HOTNESS! (@mikeal) -- [3312010](https://github.com/mikeal/request/commit/3312010f72d035f22b87a6d8d463f0d91b88fea1) markdown badge instead. (@mikeal) -- [9cf657c](https://github.com/mikeal/request/commit/9cf657c1f08bf460911b8bb0a8c5c0d3ae6135c7) Shorter title. (@mikeal) -- [2c61d66](https://github.com/mikeal/request/commit/2c61d66f1dc323bb612729c7320797b79b22034c) put Request out (@joaojeronimo) -- [28513a1](https://github.com/mikeal/request/commit/28513a1b371452699438c0eb73471f8969146264) 2.26.0 (@mikeal) - -### v2.25.1 (2013/07/23 21:51 +00:00) -- [6387b21](https://github.com/mikeal/request/commit/6387b21a9fb2e16ee4dd2ab73b757eca298587b5) 2.25.1 (@mikeal) - -### v2.25.0 (2013/07/23 21:51 +00:00) -- [828f12a](https://github.com/mikeal/request/commit/828f12a1ae0f187deee4d531b2eaf7531169aaf2) 2.25.0 (@mikeal) - -### v2.24.1 (2013/07/23 20:51 +00:00) -- [29ae1bc](https://github.com/mikeal/request/commit/29ae1bc454c03216beeea69d65b538ce4f61e8c1) 2.24.1 (@mikeal) - -### v2.24.0 (2013/07/23 20:51 +00:00) -- [f667318](https://github.com/mikeal/request/commit/f66731870d5f3e0e5655cd89612049b540c34714) Fixed a small typo (@michalstanko) -- [#601](https://github.com/mikeal/request/pull/601) Fixed a small typo (@michalstanko) -- [#594](https://github.com/mikeal/request/pull/594) Emit complete event when there is no callback (@RomainLK) -- [#596](https://github.com/mikeal/request/pull/596) Global agent is being used when pool is specified (@Cauldrath) -- [41ce492](https://github.com/mikeal/request/commit/41ce4926fb08242f19135fd3ae10b18991bc3ee0) New deps. (@mikeal) -- [8176c94](https://github.com/mikeal/request/commit/8176c94d5d17bd14ef4bfe459fbfe9cee5cbcc6f) 2.24.0 (@mikeal) - -### v2.23.1 (2013/07/23 02:45 +00:00) -- [63f31cb](https://github.com/mikeal/request/commit/63f31cb1d170a4af498fbdd7566f867423caf8e3) 2.23.1 (@mikeal) - -### v2.23.0 (2013/07/23 02:44 +00:00) -- [758f598](https://github.com/mikeal/request/commit/758f598de8d6024db3fa8ee7d0a1fc3e45c50f53) Initial commit. Request package. (@mikeal) -- [104cc94](https://github.com/mikeal/request/commit/104cc94839d4b71aaf3681142daefba7ace78c94) Removing unnecessary markup. (@mikeal) -- [12a4cb8](https://github.com/mikeal/request/commit/12a4cb88b949cb4a81d51189d432c25c08522a87) Matching node documentation style. (@mikeal) -- [ab96993](https://github.com/mikeal/request/commit/ab969931106b10b5f8658dc9e0f512c5dfc2a7da) Release tarball. (@mikeal) -- [e7e37ad](https://github.com/mikeal/request/commit/e7e37ad537081a040ea3e527aac23ae859b40b2c) Removing old tarball. (@mikeal) -- [e66e90d](https://github.com/mikeal/request/commit/e66e90dd814ae7bfbcd52003609d7bde9eafea57) Adding automatic redirect following. (@mikeal) -- [2fc5b84](https://github.com/mikeal/request/commit/2fc5b84832ae42f6ddb081b1909d0a6ca00c8d51) Adding SSL support. (@mikeal) -- [a3ac375](https://github.com/mikeal/request/commit/a3ac375d4b5800a038ae26233425fadc26866fbc) Fixing bug where callback fired for every redirect. (@mikeal) -- [1139efe](https://github.com/mikeal/request/commit/1139efedb5aad4a328c1d8ff45fe77839a69169f) Cleaning up tests. (@mikeal) -- [bb49fe6](https://github.com/mikeal/request/commit/bb49fe6709fa06257f4b7aadc2e450fd45a41328) Rolling version. (@mikeal) -- [4ff3493](https://github.com/mikeal/request/commit/4ff349371931ec837339aa9082c4ac7ddd4c7c35) Updates to README.md (@mikeal) -- [1c9cf71](https://github.com/mikeal/request/commit/1c9cf719c92b02ba85c4e47bd2b92a3303cbe1cf) Adding optional body buffer. (@mikeal) -- [49dfef4](https://github.com/mikeal/request/commit/49dfef42630c4fda6fb208534c00638dc0f06a6b) Rolling version. (@mikeal) -- [ab40cc8](https://github.com/mikeal/request/commit/ab40cc850652e325fcc3b0a44ee7303ae0a7b77f) Preserve the original full path. (@mikeal) -- [6d70f62](https://github.com/mikeal/request/commit/6d70f62c356f18098ca738b3dbedcf212ac3d8d8) Rolling version. (@mikeal) -- [e2ca15a](https://github.com/mikeal/request/commit/e2ca15a0f7e986e3063977ee9bd2eb69e86bdb1f) Fixing bugs and rolling version. (@mikeal) -- [8165254](https://github.com/mikeal/request/commit/81652543d3a09553cbf33095a7932dec53ccecc2) Cleanup. Fixing '' === '/' path bug. (@mikeal) -- [a0536a4](https://github.com/mikeal/request/commit/a0536a46d0b91e204fbde1e4341461bc827c9542) Rolling version. (@mikeal) -- [9ccaad7](https://github.com/mikeal/request/commit/9ccaad7dce05e5dcc3eacaf1500404622a0d8067) Adding stream support for request and response bodies. (@mikeal) -- [585166d](https://github.com/mikeal/request/commit/585166d979d4476e460e9835cc0516d04a9a3e11) Rolling version. (@mikeal) -- [41111c8](https://github.com/mikeal/request/commit/41111c88d711da80ea123df238d62038b89769bf) Bugfix release for response stream. (@mikeal) -- [86e375d](https://github.com/mikeal/request/commit/86e375d093700affe4d6d2b76a7acedbe8da140c) Remove host header when we add it. (@mikeal) -- [3a6277c](https://github.com/mikeal/request/commit/3a6277c81cfd3457c760f2aaea44852ef832a1e8) Rolling version. (@mikeal) -- [7a11f69](https://github.com/mikeal/request/commit/7a11f69d5353ecc1319e2e91ca4aefbaf0338136) writing requestBodyStream into request (@beanieboi) -- [186e9cf](https://github.com/mikeal/request/commit/186e9cf692511d768f8016d311609a0a0a315af6) Using sys.pump (@mikeal) -- [09e7ade](https://github.com/mikeal/request/commit/09e7ade541e1d40316a3f153128871a353e707b1) Fixing host port addition. Rolling version. (@mikeal) -- [cec3f3f](https://github.com/mikeal/request/commit/cec3f3f619322f27e2a82c7fd8971722f98d04d6) Using builtin base64. (@mikeal) -- [2a2e2a2](https://github.com/mikeal/request/commit/2a2e2a2f5c4760d4da3caa1a0f2d14c31a4222dc) new structure. new convenience methods (@mikeal) -- [f835b5f](https://github.com/mikeal/request/commit/f835b5fb605506b8ecd3c17bebe9ed54f0066cfc) removing old files. (@mikeal) -- [91616c4](https://github.com/mikeal/request/commit/91616c4e4f488f75a8b04b5b6f0ceef7e814cffd) Adding better redirect handling. (@mikeal) -- [3a95433](https://github.com/mikeal/request/commit/3a95433cbec9693a16ff365148489a058720ae7c) Fixing tests. (@mikeal) -- [38eb1d2](https://github.com/mikeal/request/commit/38eb1d2fa8dea582bb7c3fb37a7b05ff91857a46) By popular demand, proxy support! Not really tested yet but it seems to kinda work. (@mikeal) -- [45d41df](https://github.com/mikeal/request/commit/45d41dff63f36b25b3403e59c8b172b7aa9ed373) Added proxy auth. (@mikeal) -- [85e3d97](https://github.com/mikeal/request/commit/85e3d97e0dced39a3769c4e3f2707ba3aaab1eaa) Fixing for non-proxy case. (@mikeal) -- [f796da7](https://github.com/mikeal/request/commit/f796da74849d2b0732bd1bae1d2dcaf1243142c1) Fixing relative uri's for forwards. (@mikeal) -- [dead30e](https://github.com/mikeal/request/commit/dead30ebef9c3ff806b895e2bd32f52ba3988c69) Adding support for specifying an encoding for the response body. (@mikeal) -- [9433344](https://github.com/mikeal/request/commit/943334488dcc8e7f90727b86f9eb1bc502c33b4f) Removing debugging statement (@mikeal) -- [41efb7a](https://github.com/mikeal/request/commit/41efb7a7dcca3b47e97c23c6cdbd3e860d3bd82b) Error on maxRedirects exceeded. (@mikeal) -- [9549570](https://github.com/mikeal/request/commit/95495701fa4e99a3ab85acdab71ecdaabe0dbd45) Allow options.url, people do it all the time, might as well just support it. (@mikeal) -- [21a53c0](https://github.com/mikeal/request/commit/21a53c016edcc113e809219639807b46d29dba36) Pumping version. (@mikeal) -- [aca9782](https://github.com/mikeal/request/commit/aca9782285fe1d727570fe8d799561f45d49048e) Fixing byteLength !== string lenght issues. (@mikeal) -- [a77c296](https://github.com/mikeal/request/commit/a77c296431eda2a211f59bdb88654c4a64ed4ef3) Don't rely on automatic semicolon insertion (pretty please :) (@papandreou) -- [8b02f29](https://github.com/mikeal/request/commit/8b02f29c9019dd1d1dd291dd85889b26f592a137) Also set content-length when options.body is the empty string. (@papandreou) -- [023281c](https://github.com/mikeal/request/commit/023281ca9b4414a9bc0170c2b08aaf886a7a08f7) Simplified boolean logic. (@papandreou) -- [4f897fd](https://github.com/mikeal/request/commit/4f897fdd6c7c93bea73dbf34623f09af63bb1ed4) Simplified check for whether response.headers.location starts with "http:" or "https:". (@papandreou) -- [6d7db85](https://github.com/mikeal/request/commit/6d7db85cadf401dffdec07a4d66822207898c69e) Fixed double var declaration. (@papandreou) -- [97255cf](https://github.com/mikeal/request/commit/97255cfd2a4aa8f34d307e7cd96fe1c1f13cb26a) Process redirects as soon as the response arrives. Prevents the uninteresting redirect response from being pumped into responseBodyStream. (@papandreou) -- [b2af15f](https://github.com/mikeal/request/commit/b2af15f4fcbe1115cf8b53c5ae89fbf2365bfffc) New feature: If options.noBuffer is true, don't buffer up the response, just return it. Most of the time getting a readable stream is much more flexible than having the option to pipe the response into a writable stream. For one thing, the stream can be paused. (@papandreou) -- [fee5f89](https://github.com/mikeal/request/commit/fee5f89159a8f36b25df509c55093bf7ebd1c993) A few fixes/changes from papandreou's code, also added new semantics for onResponse. (@mikeal) -- [fa72fcb](https://github.com/mikeal/request/commit/fa72fcb950029b222f0621e2d49304e35d08c380) Updated documentation. (@mikeal) -- [4fc7209](https://github.com/mikeal/request/commit/4fc72098e7eeb9518951b9306115340ffdcce7ce) Fix for both onResponse and callback (@mikeal) -- [3153436](https://github.com/mikeal/request/commit/3153436404fca865a65649d46eb22d9797128c9d) Adding license information. (@mikeal) -- [59570de](https://github.com/mikeal/request/commit/59570dec37913c7e530303a83f03781d9aca958c) Fix for unescaping passwords for basic auth. (@notmatt) -- [0d771ab](https://github.com/mikeal/request/commit/0d771ab7882b97d776179972c51c59386f91b953) require querystring (@notmatt) -- [875f79b](https://github.com/mikeal/request/commit/875f79b6a40340457fafafdadac813cfa5343689) Allow request's body to be an object. (@Stanley) -- [86895b9](https://github.com/mikeal/request/commit/86895b9c37f7b412b7df963c2a75361ff402d8c5) Merge branch 'master' of github.com:Stanley/request (@Stanley) -- [4c9c984](https://github.com/mikeal/request/commit/4c9c984cb37bfd4e901ce24b0e9b283604c27bf4) Better tests. (@mikeal) -- [02f6b38](https://github.com/mikeal/request/commit/02f6b38c1697a55ed43940d1fd0bef6225d4faa2) Added specs for body option (@Stanley) -- [af66607](https://github.com/mikeal/request/commit/af666072a22b8df4d75fe71885139059f56ea5ee) Made specs pass (@Stanley) -- [641ec05](https://github.com/mikeal/request/commit/641ec052dd95797816e781b2c3ac2524841db7cb) Merge branch 'master' of https://github.com/Stanley/request into jsonbody (@mikeal) -- [ab4c96b](https://github.com/mikeal/request/commit/ab4c96be1c002c10806d967a4b266543f8b0267c) Moved spec tests to normal node script tests. Style changes to code and docs. (@mikeal) -- [fc2a7ef](https://github.com/mikeal/request/commit/fc2a7ef301c1266938a5aeb539e4f3fc3b5191dd) Clearer wording for json option. (@mikeal) -- [01371d7](https://github.com/mikeal/request/commit/01371d728082e22aabeb840da82a30aec62d7d8a) Removing specs loader. (@mikeal) -- [560dadd](https://github.com/mikeal/request/commit/560dadd6cbd293622c66cd82b5506704c9850b13) Adding newline to end of test files, makes for cleaner diffs in the future. (@mikeal) -- [a0348dd](https://github.com/mikeal/request/commit/a0348dd0fef462c3c678a639619c27101c757035) Add pass message when tests finish. (@mikeal) -- [da77a0e](https://github.com/mikeal/request/commit/da77a0e152c1dd43f5c1e698110d23e4d32280db) Adding better debug message on failures for GET tests. (@mikeal) -- [6aade82](https://github.com/mikeal/request/commit/6aade822a90724a47176771d137e30b0a702e7ef) throw on error. (@mikeal) -- [4f41b8d](https://github.com/mikeal/request/commit/4f41b8dbbf9a93c53d5ccdf483c9d7803e279916) Rolling version. (@mikeal) -- [7cf01f0](https://github.com/mikeal/request/commit/7cf01f0481afb367b5d0d4878645ac535cfe9a2e) master is moving to node v0.3.6+ (@mikeal) -- [cb403a4](https://github.com/mikeal/request/commit/cb403a4cfdbe3d98feb9151fdbdae1e1436e59ab) Initial support for 0.3.6+.\n\nExperimental support for Request objects as streams. It's untested and requires a pending patch to node.js (@mikeal) -- [a3c80f9](https://github.com/mikeal/request/commit/a3c80f98f42f25d4cb02d5d9e34ba0e67cc89293) Adding defaults call. (@mikeal) -- [55f22f9](https://github.com/mikeal/request/commit/55f22f96365c57aa8687de951e3f9ed982eba408) Request will keep it's own agent pool so that it can expose a maxSockets setting for easy pool sizing. (@mikeal) -- [004741c](https://github.com/mikeal/request/commit/004741c23dc0eaf61f111161bb913ba418e033e4) Fixing reference error. (@mikeal) -- [8548541](https://github.com/mikeal/request/commit/85485414150fbac58b08126b3684f81dcb930bf1) Simplified pool implementation. (@mikeal) -- [9121c47](https://github.com/mikeal/request/commit/9121c47e4cbe47bccc20a75e0e6c6c098dce04fb) Default to globalPool. (@mikeal) -- [9ec3490](https://github.com/mikeal/request/commit/9ec3490aefd52f05b57e6db13730ace54b4439d1) Support for https. Requires pending patch in node core for consistent Agent API. (@mikeal) -- [146b154](https://github.com/mikeal/request/commit/146b154a1a31ae7a30aa9f28e891e4824af548fa) Fixes for reference errors. (@mikeal) -- [8756120](https://github.com/mikeal/request/commit/8756120f83ceb94f8ba600acba274ba512696eef) Only create an agent when a relevant option is passed. (@mikeal) -- [cc3cf03](https://github.com/mikeal/request/commit/cc3cf0322847982875ff32a7cef25c39c29630ba) New HTTP client doesn't require such explicit error listener management. (@mikeal) -- [f7c0379](https://github.com/mikeal/request/commit/f7c0379b99ac7989df7f934be67cc3ae979591bb) Fixing bug in .pipe() handling. Thanks tanepiper. (@mikeal) -- [897a7ef](https://github.com/mikeal/request/commit/897a7ef020cefcb7a36c04a11e286238df8ecdaa) Fixes for streams, docs, and convenience methods. (@mikeal) -- [7c2899a](https://github.com/mikeal/request/commit/7c2899a046b750eda495b23b2d58604260deddbc) Doc fixes. (@mikeal) -- [f535fe1](https://github.com/mikeal/request/commit/f535fe1008c8f11bb37e16f95fe287ed93343704) Doc fixes. (@mikeal) -- [d1deb5b](https://github.com/mikeal/request/commit/d1deb5b4dda4474fe9d480ad42ace664d89e73ee) Pipe tests, all passing! (@mikeal) -- [d67a041](https://github.com/mikeal/request/commit/d67a041783df8d724662d82f9fb792db1be3f4f0) Moving basic example to the top. (@mikeal) -- [6a98b9e](https://github.com/mikeal/request/commit/6a98b9e4a561b516b14d325c48785a9d6f40c514) Do not mix encoding option with pipeing. (@mikeal) -- [06b67ef](https://github.com/mikeal/request/commit/06b67ef01f73572a6a9b586854d4c21be427bdb2) Disable pooling with {pool:false} (@mikeal) -- [1c24881](https://github.com/mikeal/request/commit/1c248815b5dfffda43541e367bd4d66955ca0325) Send all arguments passed to stream methods. (@mikeal) -- [7946393](https://github.com/mikeal/request/commit/7946393893e75df24b390b7ab19eb5b9d6c23891) Better errors and warnings for different pipe conditions. (@mikeal) -- [ee2108d](https://github.com/mikeal/request/commit/ee2108db592113a0fe3840c361277fdd89f0c89c) Removing commented out legacy code. (@mikeal) -- [5f838b3](https://github.com/mikeal/request/commit/5f838b3582eda465f366d7df89c6dd69920405f2) Fixing redirect issue, thanks @linus (@mikeal) -- [c08758e](https://github.com/mikeal/request/commit/c08758e25290ee12278b3eb95d502645e0d66e4e) Adding del alias, thanks tanepiper. (@mikeal) -- [0b7d675](https://github.com/mikeal/request/commit/0b7d6756c120ebf17ce6c70fc1ff4ecd6850e704) Keep require('https') from throwing if node is compiled with --without-ssl. This will still throw for Invalid Protocol if https is used. Which makes more sense and makes request work without SSl support. (@davglass) -- [02fc9f7](https://github.com/mikeal/request/commit/02fc9f7cc8912402a5a98ddefaffa5f6da870562) Rolling version. Pushed new version to npm. (@mikeal) -- [0b30532](https://github.com/mikeal/request/commit/0b30532ee1a3cabb177017acfa7885b157031df2) Sent a patch today to fix this in core but this hack will fix node that predates that fix to core. (@mikeal) -- [5d5d8f4](https://github.com/mikeal/request/commit/5d5d8f43156b04fd3ceb312cfdf47cc2b0c4104d) Rolling version. Pushed new version to npm. (@mikeal) -- [1c00080](https://github.com/mikeal/request/commit/1c000809f1795d2e21635a626cf730aba2049d3e) Fixing reference to tls. (@mikeal) -- [4c355d1](https://github.com/mikeal/request/commit/4c355d1f87fced167e4b21770bfe6f8208f32b53) Be a better stream. (@mikeal) -- [9bed22f](https://github.com/mikeal/request/commit/9bed22f22e007201d4faeebdb486603c3bb088c3) Rolled version and pushed to npm (@mikeal) -- [34df8e2](https://github.com/mikeal/request/commit/34df8e2301dcfd10705b9ff3b257741b0816c8a1) typo in `request.defaults` (@clement) -- [4d7a6d4](https://github.com/mikeal/request/commit/4d7a6d46fa481e43fe873b8c8fad2f7dd816dbb5) default value only if undefined in `request.defaults` + misplaced `return` statement (@clement) -- [243a565](https://github.com/mikeal/request/commit/243a56563f1014318a467e46113b2c61b485f377) Adding support for request(url) (@mikeal) -- [83a9cec](https://github.com/mikeal/request/commit/83a9cec3cb2f7a43a1e10c13da8d0dd72b937965) Fixing case where + is in user or password. (@mikeal) -- [8bb7f98](https://github.com/mikeal/request/commit/8bb7f98ba8b78c217552c979811c07f1299318fe) making Request a duplex stream rather than adding special handling for pipes out. (@mikeal) -- [55a1fde](https://github.com/mikeal/request/commit/55a1fdedcad1e291502ce10010dda7e478a1b503) pause and resume should act on response instead of request (@tobowers) -- [63125a3](https://github.com/mikeal/request/commit/63125a33523e72e449ceef76da57b63522998282) Making request really smart about pipeing to itself so that we can do simple proxy cats (@mikeal) -- [2f9e257](https://github.com/mikeal/request/commit/2f9e257bc39eb329eec660c6d675fb40172fc5a5) Rolling version since master right now has some pretty hot new code in it. (@mikeal) -- [#31](https://github.com/mikeal/request/pull/31) Error on piping a request to a destination (@tobowers) -- [b1f3d54](https://github.com/mikeal/request/commit/b1f3d5439d24b848b2bf3a6459eea74cb0e43df3) The "end" event that was supposed to be emitted to fix a core bug in NodeJS wasn't fired because it wasn't emitted on the response object. (@voxpelli) -- [#35](https://github.com/mikeal/request/pull/35) The "end" event isn't emitted for some responses (@voxpelli) -- [40b1c67](https://github.com/mikeal/request/commit/40b1c676e1d3a292719ad2dd9cf9354c101bad47) Rolling version. (@mikeal) -- [9a28022](https://github.com/mikeal/request/commit/9a28022d0e438d0028e61a53e897689470025e50) Fixing bug in forwarding with new pipes logic. (@mikeal) -- [44e4e56](https://github.com/mikeal/request/commit/44e4e5605b0a9e02036393bcbd3a8d91280f5611) Fixing big bug in forwarding logic. (@mikeal) -- [b0cff72](https://github.com/mikeal/request/commit/b0cff72d63689d96e0b1d49a8a5aef9ccc71cb8b) Added timeout option to abort the request before the response starts responding (@mbrevoort) -- [cc76b10](https://github.com/mikeal/request/commit/cc76b109590437bfae54116e3424b2c6e44a3b3e) corrected spelling error in README (@mbrevoort) -- [#45](https://github.com/mikeal/request/pull/45) Added timeout option (@mbrevoort) -- [1cca56b](https://github.com/mikeal/request/commit/1cca56b29bb670c53d5995e76c0b075a747b5ad7) Fixing for node http client refactor. (@mikeal) -- [2a78aa3](https://github.com/mikeal/request/commit/2a78aa3f827e76c548e001fa519448b24466b518) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [ce12273](https://github.com/mikeal/request/commit/ce12273d3990c1446d3166bbd9e35c0e2435f137) New fs.ReadStream handling hotness. (@mikeal) -- [535e30a](https://github.com/mikeal/request/commit/535e30a4bd4a8e41d97ffa6a4e99630ac09a4bcb) Adding pipe support to HTTP ServerResponse objects. (@mikeal) -- [2f0cf6b](https://github.com/mikeal/request/commit/2f0cf6bf44edbaec4c0a0cb15a679302de7f0aff) Setting proper statusCode. (@mikeal) -- [6e3ecb1](https://github.com/mikeal/request/commit/6e3ecb106c3a32101d80ac0f87968fddd3ac5e2c) Adding test for pipeing file to disc. (@mikeal) -- [bbbb52e](https://github.com/mikeal/request/commit/bbbb52e406b65100b557caa3687a1aa04fab6ff3) Pumping version. (@mikeal) -- [a10b6e4](https://github.com/mikeal/request/commit/a10b6e4c08478364b8079801fdb23f3530fcc85f) Adding reference to Request instance on response to make it easier on inline callbacks. fixes #43. (@mikeal) -- [b9aff1f](https://github.com/mikeal/request/commit/b9aff1fe007dab3f93e666f047fa03a4e8f5f8b7) Add body property to resp when we have it as a shorthand. fixes #28 (@mikeal) -- [411b30d](https://github.com/mikeal/request/commit/411b30dab1fe5b20880113aa801a2fdbb7c35c40) If the error is handled and not throw we would still process redirects. Fixes #34. (@mikeal) -- [8f3c2b4](https://github.com/mikeal/request/commit/8f3c2b4f6dee8838f30e2430a23d5071128148f0) w00t! request 2.0 (@mikeal) -- [9957542](https://github.com/mikeal/request/commit/9957542cc6928443f3a7769510673665b5a90040) valid semver. (@mikeal) -- [31f5ee2](https://github.com/mikeal/request/commit/31f5ee28726ac7e14355cad0c6d2785f9ca422c6) Drastically improved header handling. (@mikeal) -- [c99b8fc](https://github.com/mikeal/request/commit/c99b8fcd706ae035f6248669b017ac2995e45f31) Return destination stream from pipe(). (@mikeal) -- [cba588c](https://github.com/mikeal/request/commit/cba588cec1e204d70f40f8bd11df0e27dc78ef0c) Style fixes. Bye Bye semi-colons. Mostly lined up with npm style. (@mikeal) -- [8515a51](https://github.com/mikeal/request/commit/8515a510ccc0a661d7c28fce6e513a7d71be7f8f) Clearer spacing. Slightly more consistent. (@mikeal) -- [3acd82a](https://github.com/mikeal/request/commit/3acd82a10e7d973fc5dbaa574c2e8906e48e1ee9) add failing test for issue #51 (@benatkin) -- [68c17f6](https://github.com/mikeal/request/commit/68c17f6c9a3d7217368b3b8bc61203e6a14eb4f0) implement parsing json response when json is truthy (@benatkin) -- [1cb1ec1](https://github.com/mikeal/request/commit/1cb1ec114b03394a0a530f245a857d8424cad02d) allow empty string (@benatkin) -- [4f8d2df](https://github.com/mikeal/request/commit/4f8d2df9f845690667a56e7698dbaf23b5028177) support JSON APIs that don't set the write content type (@benatkin) -- [#53](https://github.com/mikeal/request/pull/53) Parse json: Issue #51 (@benatkin) -- [c63e6e9](https://github.com/mikeal/request/commit/c63e6e96378a2b050bddbe1b39337662f304dc95) Adding proxy to docs, don't know why this wasn't already in. (@mikeal) -- [ef767d1](https://github.com/mikeal/request/commit/ef767d12f13a9c78d3df89add7556f5421204843) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [1b12d3a](https://github.com/mikeal/request/commit/1b12d3a9f48a6142d75fa1790c80eb313388ca44) Emit a proper error. (@mikeal) -- [47314d7](https://github.com/mikeal/request/commit/47314d7cb41fe9c3a7717a502bed9cf1b6074ffc) Greatly expanded documentation. (@mikeal) -- [e477369](https://github.com/mikeal/request/commit/e477369b4bbc271248ee8b686c556567570a6cca) Doc refinements. (@mikeal) -- [fe4d221](https://github.com/mikeal/request/commit/fe4d22109bc1411c29b253756d609856327ff146) Fix for newer npm (@mikeal) -- [7b2f788](https://github.com/mikeal/request/commit/7b2f788293e205edc7b46a7fd5304296b5e800e3) More doc cleanup. (@mikeal) -- [f8eb2e2](https://github.com/mikeal/request/commit/f8eb2e229aca38547236d48066a0b3f9f8f67638) Copy headers so that they survive mutation. (@mikeal) -- [59eab0e](https://github.com/mikeal/request/commit/59eab0e5e49c6d32697822f712ed725843e70010) Rolling version. (@mikeal) -- [76bf5f6](https://github.com/mikeal/request/commit/76bf5f6c6e37f6cb972b3d4f1ac495a4ceaaa00d) Improvements to json handling and defaults. (@mikeal) -- [81e2c40](https://github.com/mikeal/request/commit/81e2c4040a9911a242148e1d4a482ac6c745d8eb) Rolling version. (@mikeal) -- [76d8924](https://github.com/mikeal/request/commit/76d8924cab295f80518a71d5903f1e815618414f) Proper checking and handling of json bodies (@mikeal) -- [a8422a8](https://github.com/mikeal/request/commit/a8422a80895ed70e3871c7826a51933a75c51b69) Rolling version. (@mikeal) -- [f236376](https://github.com/mikeal/request/commit/f2363760782c3d532900a86d383c34f3c94f6d5f) Adding pipefilter. (@mikeal) -- [dd85f8d](https://github.com/mikeal/request/commit/dd85f8da969c2cc1825a7dfec6eac430de36440c) Rolling version. (@mikeal) -- [#66](https://github.com/mikeal/request/pull/66) Do not overwrite established content-type headers for read stream deliver (@voodootikigod) -- [b09212f](https://github.com/mikeal/request/commit/b09212f38fe736c2c92a1ee076cae9d0f4c612c3) Do not overwrite established content-type headers for read stream deliveries. (@voodootikigod) -- [01bc25d](https://github.com/mikeal/request/commit/01bc25d25343d73e9f5731b3d0df1cf5923398d4) Only apply workaround on pre-0.5 node.js and move test to assert.equal (@mikeal) -- [d487131](https://github.com/mikeal/request/commit/d487131ebc2f7a4bf265061845f7f3ea2fd3ed34) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [1200df5](https://github.com/mikeal/request/commit/1200df52bd334f9a44a43846159146b8f938fd9e) Rolling version. (@mikeal) -- [8279362](https://github.com/mikeal/request/commit/82793626f6965884a3720d66f5a276d7d4d30873) fix global var leaks (@aheckmann) -- [#67](https://github.com/mikeal/request/pull/67) fixed global variable leaks (@aheckmann) -- [ab91204](https://github.com/mikeal/request/commit/ab9120495a89536c7152e3cdf17d684323b40474) Test that chunked responses are properly toString'ed (@isaacs) -- [9bff39f](https://github.com/mikeal/request/commit/9bff39fa485f28d7f1754e72f026418ca1186783) Properly flatten chunked responses (@isaacs) -- [8e4e956](https://github.com/mikeal/request/commit/8e4e95654391c71c22933ffd422fdc82d20ac059) Fix #52 Make the tests runnable with npm (@isaacs) -- [a9aa9d6](https://github.com/mikeal/request/commit/a9aa9d6d50ef0481553da3e50e40e723a58de10a) Fix #71 Respect the strictSSL flag (@isaacs) -- [#69](https://github.com/mikeal/request/pull/69) Flatten chunked requests properly (@isaacs) -- [#73](https://github.com/mikeal/request/pull/73) Fix #71 Respect the strictSSL flag (@isaacs) -- [#70](https://github.com/mikeal/request/pull/70) add test script to package.json (@isaacs) -- [08ca561](https://github.com/mikeal/request/commit/08ca5617e0d8bcadee98f10f94a49cbf2dd02862) Fixing case where encoding is set. Also cleaning up trailing whitespace because my editor likes to do that now. (@mikeal) -- [0be269f](https://github.com/mikeal/request/commit/0be269f7d9da6c3a14a59d5579546fee9d038960) Fixing case where no body exists. (@mikeal) -- [2f37bbc](https://github.com/mikeal/request/commit/2f37bbc51ff84c3c28ae419138a19bd33a9f0103) Fixing timeout tests. (@mikeal) -- [f551a2f](https://github.com/mikeal/request/commit/f551a2f02a87994249c2fd37dc8f20a29e8bf529) Fixing legacy naming of self as options. (@mikeal) -- [717789e](https://github.com/mikeal/request/commit/717789ec9f690e9d5216ce1c27688eef822940cc) Avoid duplicate emit when using a timeout (@Marsup) -- [#76](https://github.com/mikeal/request/pull/76) Bug when a request fails and a timeout is set (@Marsup) -- [c1d255e](https://github.com/mikeal/request/commit/c1d255e5bcc5791ab69809913fe6d917ab93c8b7) global leakage in request.defaults (@isaacs) -- [14070f2](https://github.com/mikeal/request/commit/14070f269c79cae6ef9e7f7a415867150599bb8e) Don't require SSL for non-SSL requests (@isaacs) -- [4b8f696](https://github.com/mikeal/request/commit/4b8f6965e14c6fb704cf16f5bc011e4787cf32b2) Set proxy auth instead of just setting auth a second time (@isaacs) -- [cd22fbd](https://github.com/mikeal/request/commit/cd22fbdb00b90c5c75187ecf41373cfbb4af5bcd) Merge branch 'proxy-auth-bug' (@isaacs) -- [#78](https://github.com/mikeal/request/pull/78) Don't try to do strictSSL for non-ssl connections (@isaacs) -- [d8c53fc](https://github.com/mikeal/request/commit/d8c53fceca3af385753880395c680f6ec3d4d560) Removing legacy call to sys.puts (@mikeal) -- [731b32b](https://github.com/mikeal/request/commit/731b32b654bb217de3466b8d149ce480988bb24b) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [9c897df](https://github.com/mikeal/request/commit/9c897dffc7e238f10eb7e14c61978d6821c70f56) Enhance redirect handling: (1) response._redirectsFollowed reports the total number of redirects followed instead of being reset to 0; (2) add response.redirects, an array of the response.statusCode and response.headers.location for each redirect. (@danmactough) -- [#81](https://github.com/mikeal/request/pull/81) Enhance redirect handling (@danmactough) -- [4c84001](https://github.com/mikeal/request/commit/4c8400103ec18a0729e29e9ffb17dda65ce02f6d) Document strictSSL option (@isaacs) -- [d517ac0](https://github.com/mikeal/request/commit/d517ac03278b3ebd9a46ca9f263bea68d655822b) allow passing in buffers as multipart bodies (@kkaefer) -- [6563865](https://github.com/mikeal/request/commit/6563865b80573ad3c68834a6633aff6d322b59d5) bugs[web] should be bugs[url] (@isaacs) -- [2625854](https://github.com/mikeal/request/commit/262585480c148c56772dfc8386cfc59d5d262ca0) add option followAllRedirects to follow post/put redirects -- [bc057af](https://github.com/mikeal/request/commit/bc057affb58272d9152766956e5cde4ea51ca043) fix typo, force redirects to always use GET -- [d68b434](https://github.com/mikeal/request/commit/d68b434693dbf848dff4c570c4249a35329cc24f) Support node 0.5.11-style url parsing (@isaacs) -- [#96](https://github.com/mikeal/request/pull/96) Authless parsed url host support (@isaacs) -- [9f66c6d](https://github.com/mikeal/request/commit/9f66c6d79bc6515d870b906df39bd9d6d9164994) Typo, causing 'TypeError: Cannot read property 'length' of undefined' (@isaacs) -- [#97](https://github.com/mikeal/request/pull/97) Typo in previous pull causes TypeError in non-0.5.11 versions (@isaacs) -- [b320e05](https://github.com/mikeal/request/commit/b320e05f2d84510f47a6b6857d091c8cd4d3ae2e) When no request body is being sent set 'content-length':0. fixes #89 (@mikeal) -- [059916c](https://github.com/mikeal/request/commit/059916c545a0faa953cb8ac66b8c3ae243b1c8ce) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [248e9d6](https://github.com/mikeal/request/commit/248e9d65e73ac868948a82d07feaf33387723a1d) Fix for pipe() after response. Added response event, fixed and updated tests, removed deprecated stream objects. (@mikeal) -- [a2e5d6e](https://github.com/mikeal/request/commit/a2e5d6e30d3e101f8c5a034ef0401fdde8608ccf) Fixing double callback firing. node 0.5 is much better about calling errors on the client object which, when aborting on timeout, predictable emits an error which then triggers a double callback. (@mikeal) -- [5f80577](https://github.com/mikeal/request/commit/5f805775e6aeaaf229cc781439b29108fb69f373) Release for 0.6 (@mikeal) -- [bf906de](https://github.com/mikeal/request/commit/bf906de601121b52c433b0af208550f1db892cde) Adding some oauth support, tested with Twitter. (@mikeal) -- [8869b2e](https://github.com/mikeal/request/commit/8869b2e88cc305e224556c5ca75b7b59311911d9) Removing irrelevant comments. (@mikeal) -- [8323eed](https://github.com/mikeal/request/commit/8323eed4915bb73b33544bc276f3840c13969134) Closed issue 82 : handling cookies - added tests too -- [739f841](https://github.com/mikeal/request/commit/739f84166d619778ab96fd0b0f4f1f43e8b0fdda) Closed issue 82 : handling cookies - added tests too -- [7daf841](https://github.com/mikeal/request/commit/7daf8415fb1a4e707ec54eb413169e49d8bbe521) Closed issue 82 : handling cookies - added tests too -- [6c22041](https://github.com/mikeal/request/commit/6c22041a4719bf081c827dda8f35e7b79b4c39d9) changed README -- [3db7f7d](https://github.com/mikeal/request/commit/3db7f7d38e95406b84f06fed52b69038b0250904) Updated README -- [6181b7a](https://github.com/mikeal/request/commit/6181b7a8a4be75bcf75cd3ff6dacb8e910737e92) Documented request.cookie() and request.jar() -- [fc44260](https://github.com/mikeal/request/commit/fc44260d13f0094bfe96d18878a11c6fe88b69e5) Tiny cookie example error on README -- [366831b](https://github.com/mikeal/request/commit/366831b705b5d5ebfbec5f63b4b140cbafcb4515) Remove instanceof check for CookieJar (mikeal suggestion) -- [88488cf](https://github.com/mikeal/request/commit/88488cf076efbd916b0326e0981e280c993963a7) Also add cookie to the user defined cookie jar (mikeal's suggestion) -- [f6fef5b](https://github.com/mikeal/request/commit/f6fef5bfa4ba8e1dfa3022df8991716e5cba7264) Updated cookie documentation in README file -- [b519044](https://github.com/mikeal/request/commit/b5190441a889164dfeb4148fac643fd7a87cfb51) request.defaults({jar: false}) disables cookies && also updated README -- [856a65c](https://github.com/mikeal/request/commit/856a65cd28402efbe3831a68d73937564a27ea9b) Update jar documentation in the options also -- [#102](https://github.com/mikeal/request/pull/102) Implemented cookies - closes issue 82: https://github.com/mikeal/request/issues/82 (@alessioalex) -- [62592e7](https://github.com/mikeal/request/commit/62592e7fe9ee5ecaee80b8f5bc2400e4a277e694) Cookie bugs (@janjongboom) -- [a06ad2f](https://github.com/mikeal/request/commit/a06ad2f955270974409e75c088e1f5d1f5298ff5) Follow redirects should work on PUT and POST requests as well. This is more consistent to other frameworks, e.g. .NET (@janjongboom) -- [bf3f5d3](https://github.com/mikeal/request/commit/bf3f5d30fdabf6946096623fc3398bb66ed19a1f) Cookies shouldn't be discarded when followRedirect = true (@janjongboom) -- [16db85c](https://github.com/mikeal/request/commit/16db85c07e6c2516269299640fdddca6db7bc051) Revert "Follow redirects should work on PUT and POST requests as well. This is more consistent to other frameworks, e.g. .NET" (@janjongboom) -- [841664e](https://github.com/mikeal/request/commit/841664e309f329be98c1a011c634f5291af1eebc) Add test for proxy option (@dominictarr) -- [#105](https://github.com/mikeal/request/pull/105) added test for proxy option. (@dominictarr) -- [50d2d39](https://github.com/mikeal/request/commit/50d2d3934cd86d7142a4aab66017bb1ef82329cf) Fixing test, emitter matches on req.url so it needs the full url. (@mikeal) -- [668a291](https://github.com/mikeal/request/commit/668a291013380af305eba12b1d5c7a5376a74c76) Adding some documentation for OAuth signing support. (@mikeal) -- [04faa3b](https://github.com/mikeal/request/commit/04faa3bf2b1f4ec710414c6ec7231b24767b2f89) Minor improvements in example (@mikeal) -- [0fddc17](https://github.com/mikeal/request/commit/0fddc1798dcd9b213e3f8aec504c61cecf4d7997) Another small fix to the url in the docs. (@mikeal) -- [337649a](https://github.com/mikeal/request/commit/337649a08b4263c0d108cd4621475c8ff9cf8dd0) Add oauth to options. (@mikeal) -- [#86](https://github.com/mikeal/request/pull/86) Can't post binary to multipart requests (@developmentseed) -- [4e4d428](https://github.com/mikeal/request/commit/4e4d4285490be20abf89ff1fb54fb5088c01c00e) Update to Iris Couch URL (@jhs) -- [#110](https://github.com/mikeal/request/pull/110) Update to Iris Couch URL (@iriscouch) -- [d7af099](https://github.com/mikeal/request/commit/d7af0994b382466367f2cafc5376150e661eeb9d) Remove the global `i` as it's causing my test suites to fail with leak detection turned on. (@3rd-Eden) -- [#117](https://github.com/mikeal/request/pull/117) Remove the global `i` (@3rd-Eden) -- [b2a4ad1](https://github.com/mikeal/request/commit/b2a4ad1e7d7553230e932ea093d7f77f38147ef9) Force all cookie keys into lower case as suggested by LinusU (@jhurliman) -- [055a726](https://github.com/mikeal/request/commit/055a7268b40425643d23bd6a4f09c7268dbab680) Applying a modified version of pull request #106 as suggested by janjongboom (@jhurliman) -- [#121](https://github.com/mikeal/request/pull/121) Another patch for cookie handling regression (@jhurliman) -- [a353f4e](https://github.com/mikeal/request/commit/a353f4eeb312ea378d34b624f5c4df33eefa152c) Merge remote-tracking branch 'upstream/master' (@janjongboom) -- [#104](https://github.com/mikeal/request/pull/104) Cookie handling contains bugs (@janjongboom) -- [a3be5ad](https://github.com/mikeal/request/commit/a3be5ad5ea112422ed00da632530b93bcf54727c) Fix encoding of characters like ( (@mikeal) -- [dd2067b](https://github.com/mikeal/request/commit/dd2067bbbf77d1132c9ed480848645136b8a5521) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [ddc4e45](https://github.com/mikeal/request/commit/ddc4e453c3b9a0e11da4df156c5e15206abfc1ef) Pushed new version to npm (@mikeal) -- [feee5eb](https://github.com/mikeal/request/commit/feee5ebd2ca8c09db25b5cb13cd951f7c4322a49) Real fix for encoding issues in javascript and oauth. (@mikeal) -- [23896cd](https://github.com/mikeal/request/commit/23896cdc66d75ec176876167ff21da72b7ff181b) Pushed new version to npm. (@mikeal) -- [a471ed2](https://github.com/mikeal/request/commit/a471ed2ca8acdca1010a0fc20434c5c9956b0d0c) HTTP redirect tests (@jhs) -- [a4a9aa1](https://github.com/mikeal/request/commit/a4a9aa199ff958630791e131092ec332ada00a49) A self-signed certificate for upcoming HTTPS testing (@jhs) -- [10ac6b9](https://github.com/mikeal/request/commit/10ac6b9db40263bec1bf63ee7e057000ffd2d7e9) HTTPS tests, for now a copy of the test-body tests (@jhs) -- [105aed1](https://github.com/mikeal/request/commit/105aed1ff99add1957f91df7efabf406e262f463) Support an "httpModules" object for custom http/https module behavior (@jhs) -- [#112](https://github.com/mikeal/request/pull/112) Support using a custom http-like module (@iriscouch) -- [d05a875](https://github.com/mikeal/request/commit/d05a8753af576fc1adccc7ffe9633690371c05ee) Test for #129 (@mikeal) -- [06cdfaa](https://github.com/mikeal/request/commit/06cdfaa3c29233dac3f47e156f2b5b3a0f0ae4b8) return body as buffer when encoding is null -- [#132](https://github.com/mikeal/request/pull/132) return the body as a Buffer when encoding is set to null (@jahewson) -- [4882e51](https://github.com/mikeal/request/commit/4882e519ed6b8d08795da5de37166148ce0ee440) fixed cookies parsing, updated tests (@afanasy) -- [2be228e](https://github.com/mikeal/request/commit/2be228ec8b48a60028bd1d80c8cbebf23964f913) Change `host` to `hostname` in request hash -- [#135](https://github.com/mikeal/request/pull/135) host vs hostname (@iangreenleaf) -- [e24abc5](https://github.com/mikeal/request/commit/e24abc5cc2c6fa154ae04fe58a16d135eeba4951) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [c99c809](https://github.com/mikeal/request/commit/c99c809bb48b9c0193aae3789c5c844f7f6cbe92) Reverting host -> hostname because it breaks in pre-0.6. (@mikeal) -- [a1134d8](https://github.com/mikeal/request/commit/a1134d855f928fde5c4fe9ee255c111da0195bfc) adding logging (@mikeal) -- [#133](https://github.com/mikeal/request/pull/133) Fixed cookies parsing (@afanasy) -- [9179471](https://github.com/mikeal/request/commit/9179471f9f63b6ba9c9078a35cb888337ce295e8) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [cbb180b](https://github.com/mikeal/request/commit/cbb180b0399074995c235a555e3e3e162d738f7c) Fixes to oauth test. (@mikeal) -- [e1c351f](https://github.com/mikeal/request/commit/e1c351f92958634ccf3fbe78aa2f5b06d9c9a5fa) Published new version. (@mikeal) -- [3ceee86](https://github.com/mikeal/request/commit/3ceee86f1f3aad3a6877d6d3813e087549f3b485) Formatting fixes. (@mikeal) -- [18e1af5](https://github.com/mikeal/request/commit/18e1af5e38168dcb95c8ae29bb234f1ad9bbbdf9) Fixing log error. (@mikeal) -- [edc19b5](https://github.com/mikeal/request/commit/edc19b5249f655714efa0f8fa110cf663b742921) Pushed new version. (@mikeal) -- [f51c32b](https://github.com/mikeal/request/commit/f51c32bd6f4da0419ed8404b610c43ee3f21cf92) added "form" option to readme. (@petejkim) -- [#144](https://github.com/mikeal/request/pull/144) added "form" option to readme (@petejkim) -- [b58022e](https://github.com/mikeal/request/commit/b58022ecda782af93e35e5f9601013b90b09ca73) add "forever" method (@thejh) -- [79d4651](https://github.com/mikeal/request/commit/79d46510ddff2e2c12c69f7ae4072ec489e27b0e) remove logging (@thejh) -- [f87cbf6](https://github.com/mikeal/request/commit/f87cbf6ec6fc0fc2869c340114514c887b304a80) retry on ECONNRESET on reused socket (@thejh) -- [1a91675](https://github.com/mikeal/request/commit/1a916757f4ec48b1282fddfa0aaa0fa6a1bf1267) Multipart requests should respect content-type if set; Issue #145 (@apeace) -- [#146](https://github.com/mikeal/request/pull/146) Multipart should respect content-type if previously set (@apeace) -- [#148](https://github.com/mikeal/request/pull/148) Retry Agent (@thejh) -- [70c5b63](https://github.com/mikeal/request/commit/70c5b63aca29a7d1629fa2909ff5b7199bbf0fd1) Publishing new version to npm. (@mikeal) -- [fc0f04b](https://github.com/mikeal/request/commit/fc0f04bab5d6be56a2c19d47d3e8386bd9a0b29e) Fix: timeout on socket, timeout after redirect -- [ef79e59](https://github.com/mikeal/request/commit/ef79e59bbb88ed3e7d4368fe3ca5eee411bda345) Fix: timeout after redirect 2 -- [c32a218](https://github.com/mikeal/request/commit/c32a218da2296e89a269f1832d95b12c4aa10852) merge master (@jroes) -- [d2d9b54](https://github.com/mikeal/request/commit/d2d9b545e5679b829d33deeba0b22f9050fd78b1) add line to docs describing followAllRedirects option (@jroes) -- [#90](https://github.com/mikeal/request/pull/90) add option followAllRedirects to follow post/put redirects (@jroes) -- [c08ab7e](https://github.com/mikeal/request/commit/c08ab7efaefd39c04deb6986716efe5a6069528e) Emit an event after we create the request object so that people can manipulate it before nextTick(). (@mikeal) -- [#162](https://github.com/mikeal/request/pull/162) Fix issue #159 (@dpetukhov) -- [e77a169](https://github.com/mikeal/request/commit/e77a1695c5c632c067857e99274f28a1d74301fe) fixing streaming example. fixes #164 (@mikeal) -- [ee53386](https://github.com/mikeal/request/commit/ee53386d85975c79b801edbb4f5bb7ff4c5dc90b) fixes #127 (@mikeal) -- [e2cd9de](https://github.com/mikeal/request/commit/e2cd9de9a9d10e1aa4cf4e26006bb30fa5086f0b) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [a0ab977](https://github.com/mikeal/request/commit/a0ab9770a8fb89f970bb3783ed4e6dde9e33511b) Added failing test for #125. (@papandreou) -- [c80800a](https://github.com/mikeal/request/commit/c80800a834b0f8bc0fb40d1fad4d4165a83369fd) Fix cookie jar/headers.cookie collision. Closes #125. (@papandreou) -- [1ac9e2d](https://github.com/mikeal/request/commit/1ac9e2d1bf776728a1fe676dd3693ef66f50f7f7) Redirect test: Also assert that the request cookie doesn't get doubled in the request for the landing page. (@papandreou) -- [07bbf33](https://github.com/mikeal/request/commit/07bbf331e2a0d40d261487f6222e8cafee0e50e3) Fixes #150 (@mikeal) -- [c640eed](https://github.com/mikeal/request/commit/c640eed292c06eac3ec89f60031ddf0fc0add732) Cookie jar handling: Don't double the cookies on each redirect (see discussion on #139). (@papandreou) -- [808de8b](https://github.com/mikeal/request/commit/808de8b0ba49d4bb81590ec37a873e6be4d9a416) Adding some missing mime types #138 (@serby) -- [#161](https://github.com/mikeal/request/pull/161) Fix cookie jar/headers.cookie collision (#125) (@papandreou) -- [#168](https://github.com/mikeal/request/pull/168) Picking off an EasyFix by adding some missing mimetypes. (@serby) -- [2a30487](https://github.com/mikeal/request/commit/2a304879f4218c1e46195d882bc81c0f874be329) bugfix - allow add cookie to wrapped request (defaults) (@fabianonunes) -- [a18b4f1](https://github.com/mikeal/request/commit/a18b4f14559f56cf52ca1b421daa6a934d28d51b) Making pipeDest a public prototype method rather than keeping it private. (@mikeal) -- [#170](https://github.com/mikeal/request/pull/170) can't create a cookie in a wrapped request (defaults) (@fabianonunes) -- [49a0f60](https://github.com/mikeal/request/commit/49a0f604779c91dd1759a02cbb195ccbd8d73f5d) Structural refactor, getting read for composable API. (@mikeal) -- [5daa0b2](https://github.com/mikeal/request/commit/5daa0b28b06cf109614f19e76b0e0b9b25ee3baf) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [e4df85c](https://github.com/mikeal/request/commit/e4df85c72221bf09ee7e1eb54f6c881851bd4164) Composable API for OAuth. (@mikeal) -- [945ec40](https://github.com/mikeal/request/commit/945ec40baef968ddd468c3b4dfce01621e4a0e31) Composable form API (@mikeal) -- [c30b47f](https://github.com/mikeal/request/commit/c30b47f229522a75af85da269157377b4a7dc37d) Use this, return this. (@mikeal) -- [e908644](https://github.com/mikeal/request/commit/e908644a69f9107b954f13635736f1e640216aec) Composable multipart API. (@mikeal) -- [e115677](https://github.com/mikeal/request/commit/e115677b1a03576eb96386986c350f211a4f38cd) Composable jar. Guard against overwrites on retry. (@mikeal) -- [a482e48](https://github.com/mikeal/request/commit/a482e4802e11fd122b12e18d1b18b49850fef823) Updating copyright for the new year. (@mikeal) -- [3c6581a](https://github.com/mikeal/request/commit/3c6581a9d4508fe5d75e111ae0fb94c5e0078404) Adding clobber argument for appending to headers. thanks @isaacs (@mikeal) -- [54e6aca](https://github.com/mikeal/request/commit/54e6aca0ab5982621fc9b35500f2154e50c0c95d) Fixes #144. (@mikeal) -- [12f4997](https://github.com/mikeal/request/commit/12f4997ed83bfbfefa3fc5b5635bc9a6829aa0d7) Fixing clobber. (@mikeal) -- [2f34fd1](https://github.com/mikeal/request/commit/2f34fd13b7ec86cb1c67e0a58664b9e060a34a50) Added support for a "query" option value that is a hash of querystring values that is merged (taking precedence over) with the querystring passed in the uri string. (@csainty) -- [a32d9e7](https://github.com/mikeal/request/commit/a32d9e7069533fb727a71730dbaa0f62ebefb731) Added a js based test runner so I can run tests on windows. (@csainty) -- [e0b6ce0](https://github.com/mikeal/request/commit/e0b6ce063de0c4223c97982128bb8203caf4a331) Tidied up an issue where ?> was being appended to URLs. (@csainty) -- [d47150d](https://github.com/mikeal/request/commit/d47150d6748a452df336d8de9743218028a876db) Refactored to match the composable style (@csainty) -- [b7e0929](https://github.com/mikeal/request/commit/b7e0929837873a8132476bb2b4d2e2a0fdc7cd0f) implemented issue #173 allow uri to be first argument (@twilson63) -- [b7264a6](https://github.com/mikeal/request/commit/b7264a6626481d5da50a28c91ea0be7b688c9daf) removed debug line and reset ports (@twilson63) -- [76598c9](https://github.com/mikeal/request/commit/76598c92bee64376e5d431285ac1bf6783140dbb) removed npm-debug (@twilson63) -- [#177](https://github.com/mikeal/request/pull/177) Issue #173 Support uri as first and optional config as second argument (@twilson63) -- [0f24051](https://github.com/mikeal/request/commit/0f240517dea65337636a49cb1cc2b5327504430e) Renamed query to qs. It was actually my first choice, but there appeared to be conflicts with the qs = require('querystring'). These are no longer present though and must have been unrelated. (@csainty) -- [becedaa](https://github.com/mikeal/request/commit/becedaaa7681b0c4ad5c0a9b9922fc950f091af2) Changed test structure to no longer require a server, modeled on the oauth tests. This also lets me revert some of the changes I had to make to the test server and proxy tests (@csainty) -- [9b2bbf0](https://github.com/mikeal/request/commit/9b2bbf0c12e87a59320efac67759041cd4af913f) Modified how the qs function works, it now no longer tweaks the existing request uri, instead it recreates a new one. This allows me to revert all the other changes I had to make previously and gives a nice clean commit that is self contained. (@csainty) -- [5ac7e26](https://github.com/mikeal/request/commit/5ac7e26ce4f7bf5a334df91df83699891171c0ae) failing test for .pipe(dst, opts) (@substack) -- [3b2422e](https://github.com/mikeal/request/commit/3b2422e62fbd6359b841e59a2c1888db71a22c2c) fix for failing pipe opts test (@substack) -- [8788c8b](https://github.com/mikeal/request/commit/8788c8b8cba96662e9d94a96eb04d96b904adea3) added uri param for post, put, head, del shortcuts (@twilson63) -- [#179](https://github.com/mikeal/request/pull/179) fix to add opts in .pipe(stream, opts) (@substack) -- [#180](https://github.com/mikeal/request/pull/180) Modified the post, put, head and del shortcuts to support uri optional param (@twilson63) -- [37d0699](https://github.com/mikeal/request/commit/37d0699eb681e85b7df4896b0a68b6865e596cb3) Fixing end bug i introduced being stupid. (@mikeal) -- [3a97292](https://github.com/mikeal/request/commit/3a97292f45273fa2cc937c0698ba19964780b4bb) fixed defaults functionality to support (uri, options, callback) (@twilson63) -- [#182](https://github.com/mikeal/request/pull/182) Fix request.defaults to support (uri, options, callback) api (@twilson63) -- [c94b200](https://github.com/mikeal/request/commit/c94b200258fa48697e386121a3e114ab7bed2ecf) Switched npm test from the bash script to a node script so that it is cross-platform. (@csainty) -- [#176](https://github.com/mikeal/request/pull/176) Querystring option (@csainty) -- [3b1e609](https://github.com/mikeal/request/commit/3b1e6094451e8d34c93353177de9d76e9a805e43) Adding defaults test back in. (@mikeal) -- [b4ae0c2](https://github.com/mikeal/request/commit/b4ae0c2d50f018a90a3ec8daa1d14c92a99873b9) Fixing idiotic bug I introduced. (@mikeal) -- [32f76c8](https://github.com/mikeal/request/commit/32f76c8baaf784dc2f4f1871153b1796bcebdcfe) Pushed new version to npm. (@mikeal) -- [00d0d9f](https://github.com/mikeal/request/commit/00d0d9f432182f13a5b8aa2e3a2a144b5c179015) Adding accept header to json support. (@mikeal) -- [0f580e6](https://github.com/mikeal/request/commit/0f580e6f6317c5301a52c0b6963d58e27112abca) Add abort support to the returned request (@itay) -- [4505e6d](https://github.com/mikeal/request/commit/4505e6d39a44229bfe5dc4d9a920233e05a7dfdb) Fixing some edge streaming cases with redirects by reusing the Request object. (@mikeal) -- [eed57af](https://github.com/mikeal/request/commit/eed57af8fe3e16632e9e0043d4d7f4d147dbfb8f) Published new version. (@mikeal) -- [97386b5](https://github.com/mikeal/request/commit/97386b5d7315b5c83702ffc7d0b09e34ecb67e04) Fixing pretty bad bug from the composable refactor. (@mikeal) -- [b693ce6](https://github.com/mikeal/request/commit/b693ce64e16aaa859d4edc86f82fbb11e00d33c0) Move abort to a prototype method, don't raise error (@itay) -- [1330eef](https://github.com/mikeal/request/commit/1330eef3ec84a651a435c95cf1ff1a4003086440) Merge branch 'master' of git://github.com/mikeal/request (@itay) -- [#188](https://github.com/mikeal/request/pull/188) Add abort support to the returned request (@itay) -- [5ff4645](https://github.com/mikeal/request/commit/5ff46453e713da1ae66a0d510eda4919e4080abe) Style changes. (@mikeal) -- [2dbd1e4](https://github.com/mikeal/request/commit/2dbd1e4350c2941b795b0e5ee7c0a00cd04cce09) Fixing new params style on master for head request. (@mikeal) -- [14989b2](https://github.com/mikeal/request/commit/14989b2dfc6830dbdad5364930fba1d2995aba06) Pushed new version to npm. (@mikeal) -- [0ea2351](https://github.com/mikeal/request/commit/0ea2351ef017ada9b8472f8d73086715ebe30c6a) Fixes #190. outdated check on options.json from before we had boolean support. (@mikeal) -- [21bf78c](https://github.com/mikeal/request/commit/21bf78c264316f75f4e6c571461521cda6ccf088) Adds a block on DELETE requests in status 300-400 (@goatslacker) -- [0c0c201](https://github.com/mikeal/request/commit/0c0c20139b28b21a860f72b8ce0124046fae421d) Adds tests for GH-119 Fix (@goatslacker) -- [#193](https://github.com/mikeal/request/pull/193) Fixes GH-119 (@goatslacker) -- [5815a69](https://github.com/mikeal/request/commit/5815a697347f20658dc2bdfd0d06e41d0aa0dac4) Fixes #194. setTimeout only works on node 0.6+ (@mikeal) -- [1ddcd60](https://github.com/mikeal/request/commit/1ddcd605bc8936c5b3534e1cf9aa1b29fa2b060b) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [7b35b4f](https://github.com/mikeal/request/commit/7b35b4ff63bbdf133f0f600a88a87b5723d29bdf) Removing old checks for self.req, it's ensured if start() is called. Implementing early pause/resume for when streams try to pause/resume before any data is emitted. Fixes #195. (@mikeal) -- [f01b79b](https://github.com/mikeal/request/commit/f01b79bb651f64065bac8877739223527f5b5592) Make ForeverAgent work with HTTPS (@isaacs) -- [#197](https://github.com/mikeal/request/pull/197) Make ForeverAgent work with HTTPS (@isaacs) -- [8d85b57](https://github.com/mikeal/request/commit/8d85b57ebb81c9d2d0a6b94aed41bf2ab0e3ad09) Forever inherits bugfix (@isaacs) -- [#198](https://github.com/mikeal/request/pull/198) Bugfix on forever usage of util.inherits (@isaacs) -- [37446f5](https://github.com/mikeal/request/commit/37446f54bb21cf9c83ffa81d354d799ae7ecf9ed) Add a test of HTTPS strict with CA checking (@isaacs) -- [8378d2e](https://github.com/mikeal/request/commit/8378d2ef9b8121a9851d21b3f6ec8304bde61c9d) Support tunneling HTTPS requests over proxies (@isaacs) -- [#199](https://github.com/mikeal/request/pull/199) Tunnel (@isaacs) -- [f0052ac](https://github.com/mikeal/request/commit/f0052ac5e6ca9f3f4aa49f6cda6ba15eb5d8b8e6) Published new version to npm. (@mikeal) -- [cea668f](https://github.com/mikeal/request/commit/cea668f6f7d444831313ccc0e0d301d25f2bd421) Adding more explicit error when undefined is passed as uri or options. (@mikeal) -- [047b7b5](https://github.com/mikeal/request/commit/047b7b52f3b11f4c44a02aeb1c3583940ddb59c7) Fix special method functions that get passed an options object. (@mikeal) -- [746de0e](https://github.com/mikeal/request/commit/746de0ef2f564534b29eeb8f296a59bd2c3086a7) pass through Basic authorization option for HTTPS tunneling -- [6fda9d7](https://github.com/mikeal/request/commit/6fda9d7d75e24cc1302995e41e26a91e03fdfc9a) Always clobber internal objects for qs but preserve old querystring args when clobber is present. (@mikeal) -- [75ca7a2](https://github.com/mikeal/request/commit/75ca7a25bc9c6102e87f3660a25835c7fcd70edb) Merge branch 'master' of https://github.com/mikeal/request -- [3b9f0fd](https://github.com/mikeal/request/commit/3b9f0fd3da4ae74de9ec76e7c66c57a7f8641df2) Fix cookies so that attributes are case insensitive -- [fddbd6e](https://github.com/mikeal/request/commit/fddbd6ee7d531bc4a82f629633b9d1637cb039e8) Properly set cookies during redirects -- [0d0bdb7](https://github.com/mikeal/request/commit/0d0bdb793f908492d4086fae8744f1e33e68d8c6) Remove request body when following non-GET redirects -- [#203](https://github.com/mikeal/request/pull/203) Fix cookie and redirect bugs and add auth support for HTTPS tunnel (@milewise) -- [b5fa773](https://github.com/mikeal/request/commit/b5fa773994de1799cf53491db7f5f3ba32825b20) Replace all occurrences of special chars in RFC3986 (@chriso) -- [bc6cd6c](https://github.com/mikeal/request/commit/bc6cd6ca6c6157bad76f0b2b23d4993f389ba977) documenting additional behavior of json option (@jphaas) -- [80e4e43](https://github.com/mikeal/request/commit/80e4e43186de1e9dcfaa1c9a921451560b91267c) Fixes #215. (@mikeal) -- [51f343b](https://github.com/mikeal/request/commit/51f343b9adfc11ec1b2ddcfb52a57e1e13feacb2) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [89c0f1d](https://github.com/mikeal/request/commit/89c0f1dd324bc65ad9c07436fb2c8220de388c42) titlecase authorization for oauth (@visnup) -- [#217](https://github.com/mikeal/request/pull/217) need to use Authorization (titlecase) header with Tumblr OAuth (@visnup) -- [8c163eb](https://github.com/mikeal/request/commit/8c163eb9349459839fc720658979d5c97a955825) Double quotes are optional, and the space after the ; could be required (@janjongboom) -- [#224](https://github.com/mikeal/request/pull/224) Multipart content-type change (@janjongboom) -- [96f4b9b](https://github.com/mikeal/request/commit/96f4b9b1f7b937a92f3f94f10d6d02f8878b6107) Style changes. (@mikeal) -- [b131c64](https://github.com/mikeal/request/commit/b131c64816f621cf15f8c51e76eb105778b4aad8) Adding safe .toJSON method. fixes #167 (@mikeal) -- [05d6e02](https://github.com/mikeal/request/commit/05d6e02c31ec4e6fcfadbfbe5414e701710f6e55) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [74ca9a4](https://github.com/mikeal/request/commit/74ca9a4852b666d30dd71421e8cc8b8a83177148) Unified error and complete handling. Fixes #171 (@mikeal) -- [a86c7dc](https://github.com/mikeal/request/commit/a86c7dc7d0a7c640c7def4c0215e46e76a11ff56) Fixing followAllRedirects and all the redirect tests. (@mikeal) -- [#211](https://github.com/mikeal/request/pull/211) Replace all occurrences of special chars in RFC3986 (@chriso) -- [7e24e8a](https://github.com/mikeal/request/commit/7e24e8a48d0dcfe10d0cc08b3c4e9627b9a95a97) New version on npm, first 3.0 release candidate. (@mikeal) -- [22e0f0d](https://github.com/mikeal/request/commit/22e0f0d73459c11b81b0f66a2cde85492dd8e38f) Added test for .toJSON() (@mikeal) -- [df32746](https://github.com/mikeal/request/commit/df32746f157948b6ae05e87a35cf1768e065ef0b) Adding toJSON to npm test. (@mikeal) -- [e65bfba](https://github.com/mikeal/request/commit/e65bfba98f0886a059a268dcdceabf41aec1e5cc) New version in npm. (@mikeal) -- [2b95921](https://github.com/mikeal/request/commit/2b959217151aaff7a6e7cc15e2acfccd1bbb9b85) Fixing defaults when url is passed instead of uri. (@mikeal) -- [e0534d8](https://github.com/mikeal/request/commit/e0534d860b4931a7a6e645b328fd4418a5433057) Pushed new version to npm. (@mikeal) -- [d2dc835](https://github.com/mikeal/request/commit/d2dc83538379e9e1fafb94f5698c56b4a5318d8d) don't error when null is passed for options (@polotek) -- [db80bf0](https://github.com/mikeal/request/commit/db80bf0444bd98c45f635f305154b9da20eed328) expose initParams (@polotek) -- [8cf019c](https://github.com/mikeal/request/commit/8cf019c9f9f719694408840823e92da08ab9dac3) allow request.defaults to override the main request method (@polotek) -- [#240](https://github.com/mikeal/request/pull/240) don't error when null is passed for options (@polotek) -- [69d017d](https://github.com/mikeal/request/commit/69d017de57622429f123235cc5855f36b3e18d1c) added dynamic boundary for multipart requests (@zephrax) -- [fc13e18](https://github.com/mikeal/request/commit/fc13e185f5e28a280d347e61622ba708e1cd7bbc) added dynamic boundary for multipart requests (@zephrax) -- [#243](https://github.com/mikeal/request/pull/243) Dynamic boundary (@zephrax) -- [1764176](https://github.com/mikeal/request/commit/176417698a84c53c0a69bdfd2a05a2942919816c) Fixing the set-cookie header (@jeromegn) -- [#246](https://github.com/mikeal/request/pull/246) Fixing the set-cookie header (@jeromegn) -- [6f9da89](https://github.com/mikeal/request/commit/6f9da89348b848479c23192c04b3c0ddd5a4c8bc) do not set content-length header to 0 when self.method is GET or self.method is undefined (@sethbridges) -- [efc0ea4](https://github.com/mikeal/request/commit/efc0ea44d63372a30011822ad9d37bd3d7b85952) Experimental AWS signing. Signing code from knox. (@mikeal) -- [4c08a1c](https://github.com/mikeal/request/commit/4c08a1c10bc0ebb679e212ad87419f6c4cc341eb) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [fdb10eb](https://github.com/mikeal/request/commit/fdb10eb493110b8e6e4f679524f38cef946e3f08) Adding support for aws in options. (@mikeal) -- [dac6a30](https://github.com/mikeal/request/commit/dac6a301ae03207af88fae6f5017e82157b79b41) Fixing upgraded stat size and supporting content-type and content-md5 properly. (@mikeal) -- [98cb503](https://github.com/mikeal/request/commit/98cb50325e1d7789fd9f44523d2315df5f890d10) Allow body === '' /* the empty string */. (@Filirom1) -- [0e9ac12](https://github.com/mikeal/request/commit/0e9ac12c69aaca370fbca94b41358e1c3a2f6170) fixed just another global leak of i (@sreuter) -- [#260](https://github.com/mikeal/request/pull/260) fixed just another leak of 'i' (@sreuter) -- [#255](https://github.com/mikeal/request/pull/255) multipart allow body === '' ( the empty string ) (@Filirom1) -- [#249](https://github.com/mikeal/request/pull/249) Fix for the fix of your (closed) issue #89 where self.headers[content-length] is set to 0 for all methods (@sethbridges) -- [adc9ab1](https://github.com/mikeal/request/commit/adc9ab1f563f3cb4681ac8241fcc75e6099efde2) style changes. making @rwaldron cry (@mikeal) -- [155e6ee](https://github.com/mikeal/request/commit/155e6ee270924d5698d3fea37cefc1926cbaf998) Fixed `pool: false` to not use the global agent (@timshadel) -- [1232a8e](https://github.com/mikeal/request/commit/1232a8e46752619d4d4b51d558e6725faf7bf3aa) JSON test should check for equality (@timshadel) -- [#261](https://github.com/mikeal/request/pull/261) Setting 'pool' to 'false' does NOT disable Agent pooling (@timshadel) -- [#262](https://github.com/mikeal/request/pull/262) JSON test should check for equality (@timshadel) -- [914a723](https://github.com/mikeal/request/commit/914a72300702a78a08263fe98a43d25e25713a70) consumer_key and token_secret need to be encoded for OAuth v1 (@nanodocumet) -- [500e790](https://github.com/mikeal/request/commit/500e790f8773f245ff43dd9c14ec3d5c92fe0b9e) Fix uncontrolled crash when "this.uri" is an invalid URI (@naholyr) -- [#265](https://github.com/mikeal/request/pull/265) uncaughtException when redirected to invalid URI (@naholyr) -- [#263](https://github.com/mikeal/request/pull/263) Bug in OAuth key generation for sha1 (@nanodocumet) -- [f4b87cf](https://github.com/mikeal/request/commit/f4b87cf439453b3ca1d63e85b3aeb3373ee1f17e) I'm not OCD seriously (@TehShrike) -- [#268](https://github.com/mikeal/request/pull/268) I'm not OCD seriously (@TehShrike) -- [fcab7f1](https://github.com/mikeal/request/commit/fcab7f1953cd6fb141a7d98f60580c50b59fb73f) Adding a line break to the preamble as the first part of a multipart was not recognized by a server I was communicating with. (@proksoup) -- [661b62e](https://github.com/mikeal/request/commit/661b62e5319bf0143312404f1fc81c895c46f6e6) Commenting out failing post test. Need to figure out a way to test this now that the default is to use a UUID for the frontier. (@mikeal) -- [7165c86](https://github.com/mikeal/request/commit/7165c867fa5dea4dcb0aab74d2bf8ab5541e3f1b) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [5a7ca9b](https://github.com/mikeal/request/commit/5a7ca9b398c1300c08a28fb7f266054c3ce8c57a) Added drain event and returning the boolean from write to proper handle back pressure when piping. (@mafintosh) -- [#273](https://github.com/mikeal/request/pull/273) Pipe back pressure issue (@mafintosh) -- [f8ae8d1](https://github.com/mikeal/request/commit/f8ae8d18627e4743996d8600f77f4e4c05a2a590) New version in npm. (@mikeal) -- [7ff5dae](https://github.com/mikeal/request/commit/7ff5daef152bcfac5b02e661e5476a57b9693489) Merge remote-tracking branch 'upstream/master' (@proksoup) -- [1f34700](https://github.com/mikeal/request/commit/1f34700e5614ea2a2d78b80dd467c002c3e91cb3) fix tests with boundary by injecting boundry from header (@benatkin) -- [ee2b2c2](https://github.com/mikeal/request/commit/ee2b2c2f7a8625fde4d71d79e19cdc5d98f09955) Like in [node.js](https://github.com/joyent/node/blob/master/lib/net.js#L52) print logs if NODE_DEBUG contains the word request (@Filirom1) -- [#279](https://github.com/mikeal/request/pull/279) fix tests with boundary by injecting boundry from header (@benatkin) -- [3daebaf](https://github.com/mikeal/request/commit/3daebaf2551c8d0df7dac1ebff0af4fe08608768) Merge branch 'master' of https://github.com/mikeal/request (@proksoup) -- [dba2ebf](https://github.com/mikeal/request/commit/dba2ebf09552258f37b60122c19b236064b0d216) Updating with corresponding tests. (@proksoup) -- [396531d](https://github.com/mikeal/request/commit/396531d083c94bc807a25f7c3a50a0c92a00c5f7) Removing console.log of multipart (@proksoup) -- [54226a3](https://github.com/mikeal/request/commit/54226a38816b4169e0a7a5d8b1a7feba78235fec) Okay, trying it as an optional parameter, with a new test in test-body.js to verify (@proksoup) -- [23ae7d5](https://github.com/mikeal/request/commit/23ae7d576cc63d645eecf057112b71d6cb73e7b1) Remove non-"oauth_" parameters from being added into the OAuth Authorization header (@jplock) -- [8b82ef4](https://github.com/mikeal/request/commit/8b82ef4ff0b50b0c8dcfb830f62466fa30662666) Removing guard, there are some cases where this is valid. (@mikeal) -- [82440f7](https://github.com/mikeal/request/commit/82440f76f22a5fca856735af66e2dc3fcf240c0d) Adding back in guard for _started, need to keep some measure of safety but we should defer this restriction for as long as possible. (@mikeal) -- [#282](https://github.com/mikeal/request/pull/282) OAuth Authorization header contains non-"oauth_" parameters (@jplock) -- [087be3e](https://github.com/mikeal/request/commit/087be3ebbada53699d14839374f1679f63f3138f) Remove stray `console.log()` call in multipart generator. (@bcherry) -- [0a8a5ab](https://github.com/mikeal/request/commit/0a8a5ab6a08eaeffd45ef4e028be2259d61bb0ee) Merge remote-tracking branch 'upstream/master' (@proksoup) -- [#241](https://github.com/mikeal/request/pull/241) Composability updates suggested by issue #239 (@polotek) -- [#284](https://github.com/mikeal/request/pull/284) Remove stray `console.log()` call in multipart generator. (@bcherry) -- [8344666](https://github.com/mikeal/request/commit/8344666f682a302c914cce7ae9cea8de054f9240) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) -- [#272](https://github.com/mikeal/request/pull/272) Boundary begins with CRLF? (@proksoup) -- [#214](https://github.com/mikeal/request/pull/214) documenting additional behavior of json option (@jphaas) -- [#207](https://github.com/mikeal/request/pull/207) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) -- [9cadd61](https://github.com/mikeal/request/commit/9cadd61d989e85715ea07da8770a3077db41cca3) Allow parser errors to bubble up to request (@mscdex) -- [6a00fea](https://github.com/mikeal/request/commit/6a00fea09eed99257c0aec2bb66fbf109b0f573a) Only add socket error handler callback once (@mscdex) -- [975ea90](https://github.com/mikeal/request/commit/975ea90bed9503c67055b20e36baf4bcba54a052) Fix style (@mscdex) -- [205dfd2](https://github.com/mikeal/request/commit/205dfd2e21c13407d89d3ed92dc2b44b987d962b) Use .once() when listening for parser error (@mscdex) -- [ff9b564](https://github.com/mikeal/request/commit/ff9b5643d6b5679a9e7d7997ec6275dac10b000e) Add a space after if (@Filirom1) -- [#280](https://github.com/mikeal/request/pull/280) Like in node.js print options if NODE_DEBUG contains the word request (@Filirom1) -- [d38e57b](https://github.com/mikeal/request/commit/d38e57bbb3d827aa87427f2130aa5a5a3a973161) Test for #289 (@isaacs) -- [820af58](https://github.com/mikeal/request/commit/820af5839f2a193d091d98f23fd588bd919e3e58) A test of POST redirect following with 303 status (@isaacs) -- [7adc5a2](https://github.com/mikeal/request/commit/7adc5a21869bc92cc3b5e84d32c585952c8e5e87) Use self.encoding when calling Buffer.toString() (@isaacs) -- [#290](https://github.com/mikeal/request/pull/290) A test for #289 (@isaacs) -- [#293](https://github.com/mikeal/request/pull/293) Allow parser errors to bubble up to request (@mscdex) -- [ed68b8d](https://github.com/mikeal/request/commit/ed68b8dd024561e9d47d80df255fb79d783c13a7) Updated the twitter oauth dance. The comments weren't clear. Also removed token_key. No longer needed with twitter oauth. (@joemccann) -- [6bc19cd](https://github.com/mikeal/request/commit/6bc19cda351b59f8e45405499a100abd0b456e42) Forgot to remove token_secret; no longer needed for twitter. (@joemccann) -- [1f21b17](https://github.com/mikeal/request/commit/1f21b17fc4ff3a7011b23e3c9261d66effa3aa40) Adding form-data support. (@mikeal) -- [827e950](https://github.com/mikeal/request/commit/827e950500746eb9d3a3fa6f174416b194c9dedf) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [b211200](https://github.com/mikeal/request/commit/b2112009a31fc7f9122970d392750f62b6e77111) Test fixes for relative import. Adding to run all (@mikeal) -- [1268195](https://github.com/mikeal/request/commit/1268195b75bd5bb3954b4c4f2d9feb80a97994d1) Bundling mime module rather than keep around our own mime-map. (@mikeal) -- [4f51cec](https://github.com/mikeal/request/commit/4f51cecdc363946b957585c3deccfd8c37e19aa0) Docs for the form API, pumping version. (@mikeal) -- [90245d7](https://github.com/mikeal/request/commit/90245d7199215d7b195cf7e36b203ca0bd0a6bd3) Doc fixes. (@mikeal) -- [d98ef41](https://github.com/mikeal/request/commit/d98ef411c560bd1168f242c524a378914ff8eac4) Pushed new version to npm. (@mikeal) -- [3e11937](https://github.com/mikeal/request/commit/3e119375acda2da225afdb1596f6346dbd551fba) Pass servername to tunneling secure socket creation (@isaacs) -- [7725b23](https://github.com/mikeal/request/commit/7725b235fdec8889c0c91d55c99992dc683e2e22) Declare dependencies more sanely (@isaacs) -- [#317](https://github.com/mikeal/request/pull/317) Workaround for #313 (@isaacs) -- [#318](https://github.com/mikeal/request/pull/318) Pass servername to tunneling secure socket creation (@isaacs) -- [0c470bc](https://github.com/mikeal/request/commit/0c470bccf1ec097ae600b6116e6244cb624dc00e) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [0d98e5b](https://github.com/mikeal/request/commit/0d98e5b7ea6bd9c4f21535d3682bbed2f2e05df4) Pushed new version to npm. (@mikeal) -- [64a4448](https://github.com/mikeal/request/commit/64a44488ac8c792a1f548f305fc5c61efe0d77fb) when setting defaults, the wrapper adds the jar method assuming it has the same signature as get, meaning undefined is passed into initParams, which subsequently fails. now passing jar function directly as it has no need of defaults anyway seeing as it only creates a new cookie jar (@StuartHarris) -- [48c9881](https://github.com/mikeal/request/commit/48c988118bda4691fffbfcf30d5a39b6c1438736) Added test to illustrate #321 (@alexindigo) -- [8ce0f2a](https://github.com/mikeal/request/commit/8ce0f2a3b6929cd0f7998e00d850eaf5401afdb7) Added *src* stream removal on redirect. #321 (@alexindigo) -- [c32f0bb](https://github.com/mikeal/request/commit/c32f0bb9feaa71917843856c23b4aae99f78ad4d) Do not try to remove listener from an undefined connection (@strk) -- [#326](https://github.com/mikeal/request/pull/326) Do not try to remove listener from an undefined connection (@CartoDB) -- [#322](https://github.com/mikeal/request/pull/322) Fix + test for piped into request bumped into redirect. #321 (@alexindigo) -- [85b6a63](https://github.com/mikeal/request/commit/85b6a632ac7d3456485fbf931043f10f5f6344a5) New version in npm. (@mikeal) -- [f462bd3](https://github.com/mikeal/request/commit/f462bd3fa421fa5e5ca6c91852333db90297b80e) Rolling trunk version. (@mikeal) -- [8a82c5b](https://github.com/mikeal/request/commit/8a82c5b0990cc58fa4cb7f81814d13ba7ae35453) Adding url to redirect error for better debugging. (@mikeal) -- [013c986](https://github.com/mikeal/request/commit/013c986d0a8b5b2811cd06dd3733f4a3d37df1cc) Better debugging of max redirect errors. (@mikeal) -- [#320](https://github.com/mikeal/request/pull/320) request.defaults() doesn't need to wrap jar() (@redbadger) -- [4797f88](https://github.com/mikeal/request/commit/4797f88b42c3cf8680cbde09bf473678a5707aed) Fix #296 - Only set Content-Type if body exists (@Marsup) -- [f6bcf3e](https://github.com/mikeal/request/commit/f6bcf3eb51982180e813c69cccb942734f815ffe) fixup aws function to work in more situations (@nlf) -- [ba6c88a](https://github.com/mikeal/request/commit/ba6c88af5e771c2a0e007e6166e037a149561e09) added short blurb on using aws (@nlf) -- [#343](https://github.com/mikeal/request/pull/343) Allow AWS to work in more situations, added a note in the README on its usage (@nathan-lafreniere) -- [288c52a](https://github.com/mikeal/request/commit/288c52a2a1579164500c26136552827112801ff1) switch to a case insensitive getter when fetching headers for aws auth signing (@nlf) -- [#332](https://github.com/mikeal/request/pull/332) Fix #296 - Only set Content-Type if body exists (@Marsup) -- [7a16286](https://github.com/mikeal/request/commit/7a162868de65b6de15e00c1f707b5e0f292c5f86) Emit errors for anything in init so that it is catchable in a redirect. (@mikeal) -- [d288d21](https://github.com/mikeal/request/commit/d288d21d709fa81067f5af53737dfde06f842262) fix bug (@azylman) -- [#355](https://github.com/mikeal/request/pull/355) stop sending erroneous headers on redirected requests (@azylman) -- [b0b97f5](https://github.com/mikeal/request/commit/b0b97f53a9e94f3aeaa05e2cda5b820668f6e3b2) delete _form along with everything else on a redirect (@jgautier) -- [#360](https://github.com/mikeal/request/pull/360) Delete self._form along with everything else on redirect (@jgautier) -- [61e3850](https://github.com/mikeal/request/commit/61e3850f0f91ca6732fbd06b46796fbcd2fea1ad) Made it so that if we pass in Content-Length or content-length in the headers, don't make a new version (@danjenkins) -- [#361](https://github.com/mikeal/request/pull/361) Don't create a Content-Length header if we already have it set (@danjenkins) -- [590452d](https://github.com/mikeal/request/commit/590452d6569e68e480d4f40b88022f1b81914ad6) inside oauth.hmacsign: running rfc3986 on base_uri instead of just encodeURIComponent. -- [#362](https://github.com/mikeal/request/pull/362) Running `rfc3986` on `base_uri` in `oauth.hmacsign` instead of just `encodeURIComponent` (@jeffmarshall) -- [f7dc90c](https://github.com/mikeal/request/commit/f7dc90c8dae743d5736dc6c807eecde613eb4fd4) Revert "Merge pull request #362 from jeffmarshall/master" (@mikeal) -- [d631a26](https://github.com/mikeal/request/commit/d631a26e263077eca3d4925de9b0a8d57365ba90) reintroducing the WTF escape + encoding, also fixing a typo. -- [#363](https://github.com/mikeal/request/pull/363) rfc3986 on base_uri, now passes tests (@jeffmarshall) -- [bfe2791](https://github.com/mikeal/request/commit/bfe2791f596b749eed6961159d41a404c3aba0d0) oauth fix. (@mikeal) -- [#344](https://github.com/mikeal/request/pull/344) Make AWS auth signing find headers correctly (@nathan-lafreniere) -- [e863f25](https://github.com/mikeal/request/commit/e863f25336abc7b9f9936c20e0c06da8db0c6593) style change. (@mikeal) -- [3e5a87c](https://github.com/mikeal/request/commit/3e5a87ce28b3bb45861b32f283cd20d0084d78a7) Don't remove x_auth_type for Twitter reverse auth (@drudge) -- [#369](https://github.com/mikeal/request/pull/369) Don't remove x_auth_mode for Twitter reverse auth (@drudge) -- [25d4667](https://github.com/mikeal/request/commit/25d466773c43949e2eea4236ffc62841757fd1f0) x_auth_mode not x_auth_type (@drudge) -- [#370](https://github.com/mikeal/request/pull/370) Twitter reverse auth uses x_auth_mode not x_auth_type (@drudge) -- [cadf4dc](https://github.com/mikeal/request/commit/cadf4dc54f4ee3fae821f6beb1ea6443e528bf6f) massive style commit. (@mikeal) -- [33453a5](https://github.com/mikeal/request/commit/33453a53bc37e4499853b9d929b3603cdf7a31cd) New version in npm. (@mikeal) -- [b638185](https://github.com/mikeal/request/commit/b6381854006470af1d0607f636992c7247b6720f) Setting master version. (@mikeal) -- [8014d2a](https://github.com/mikeal/request/commit/8014d2a5b797f07cf56d2f39a346031436e1b064) correct Host header for proxy tunnel CONNECT (@ypocat) -- [#374](https://github.com/mikeal/request/pull/374) Correct Host header for proxy tunnel CONNECT (@ypocat) -- [8c3e9cb](https://github.com/mikeal/request/commit/8c3e9cb529767cff5e7206e2e76531183085b42a) If one of the request parameters is called "timestamp", the "oauth_timestamp" OAuth parameter will get removed during the parameter cleanup loop. (@jplock) -- [#375](https://github.com/mikeal/request/pull/375) Fix for missing oauth_timestamp parameter (@jplock) -- [69e6dc5](https://github.com/mikeal/request/commit/69e6dc5c80e67bbd7d135c3ceb657a1b2df58763) Fixed headers piping on redirects (@kapetan) -- [#376](https://github.com/mikeal/request/pull/376) Headers lost on redirect (@kapetan) -- [62dbbf3](https://github.com/mikeal/request/commit/62dbbf3d77b0851ba424d4f09d1d0c0be91c1f2d) Resolving the Invalid signature when using "qs" (@landeiro) -- [d4cf4f9](https://github.com/mikeal/request/commit/d4cf4f98e11f9a85b6bdfd0481c85c8ac34061ce) fixes missing host header on retried request when using forever agent -- [#380](https://github.com/mikeal/request/pull/380) Fixes missing host header on retried request when using forever agent (@mac-) -- [#381](https://github.com/mikeal/request/pull/381) Resolving "Invalid signature. Expected signature base string: " (@landeiro) -- [ea2f975](https://github.com/mikeal/request/commit/ea2f975ae83efe956b77cbcd0fd9ad42c0d5192f) Ensure that uuid is treated as a property name, not an index. (@othiym23) -- [#388](https://github.com/mikeal/request/pull/388) Ensure "safe" toJSON doesn't break EventEmitters (@othiym23) -- [11a3bc0](https://github.com/mikeal/request/commit/11a3bc0ea3063f6f0071248e03c8595bfa9fd046) Add more reporting to tests (@mmalecki) -- [#398](https://github.com/mikeal/request/pull/398) Add more reporting to tests (@mmalecki) -- [b85bf63](https://github.com/mikeal/request/commit/b85bf633fe8197dc38855f10016a0a76a8ab600a) Optimize environment lookup to happen once only (@mmalecki) -- [#403](https://github.com/mikeal/request/pull/403) Optimize environment lookup to happen once only (@mmalecki) -- [dbb9a20](https://github.com/mikeal/request/commit/dbb9a205fafd7bf5a05d2dbe7eb2c6833b4387dc) renaming tests/googledoodle.png to match it's actual image type of jpeg (@nfriedly) -- [e2d7d4f](https://github.com/mikeal/request/commit/e2d7d4fd35869354ba14a333a4b4989b648e1971) Add more auth options, including digest support (@nylen) -- [d0d536c](https://github.com/mikeal/request/commit/d0d536c1e5a9a342694ffa5f14ef8fbe8dcfa8bd) Add tests for basic and digest auth (@nylen) -- [85fd359](https://github.com/mikeal/request/commit/85fd359890646ef9f55cc6e5c6a32e74f4fbb786) Document new auth options (@nylen) -- [#338](https://github.com/mikeal/request/pull/338) Add more auth options, including digest support (@nylen) -- [fd2e2fa](https://github.com/mikeal/request/commit/fd2e2fa1e6d580cbc34afd3ae1200682cecb3cf9) Fixed a typo. (@jerem) -- [#415](https://github.com/mikeal/request/pull/415) Fixed a typo. (@jerem) -- [53c1508](https://github.com/mikeal/request/commit/53c1508c9c6a58f7d846de82cad36402497a4a4f) Fix for #417 (@mikeal) -- [b23f985](https://github.com/mikeal/request/commit/b23f985e02da4a96f1369541a128c4204a355666) Fixing merge conflict. (@mikeal) -- [28e8be5](https://github.com/mikeal/request/commit/28e8be5175793ac99236df88e26c0139a143e32d) Lost a forever fix in the previous merge. Fixing. (@mikeal) -- [e4d1e25](https://github.com/mikeal/request/commit/e4d1e25c1648ef91f6baf1ef407c712509af4b66) Copy options before adding callback. (@nrn) -- [22bc67d](https://github.com/mikeal/request/commit/22bc67d7ac739e9c9f74c026f875a0a7c686e29d) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) -- [#430](https://github.com/mikeal/request/pull/430) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) -- [6b11acf](https://github.com/mikeal/request/commit/6b11acf3e29fb84daef4e940314cae5ac2e580c6) Updating form-data. (@mikeal) -- [d195845](https://github.com/mikeal/request/commit/d195845c3e1de42c9aee752eec8efa4dda87ec74) Updating mime (@mikeal) -- [20ba1d6](https://github.com/mikeal/request/commit/20ba1d6d38191aa7545b927a7262a18c5c63575b) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [0150d9f](https://github.com/mikeal/request/commit/0150d9fa13e51d99880013b9ec29343850b40c2f) Consider `options.rejectUnauthorized` when pooling https agents (@mmalecki) -- [3e07b6d](https://github.com/mikeal/request/commit/3e07b6d4b81037d0e6e595670db483708ffa8698) Use `rejectUnauthorized: false` in tests (@mmalecki) -- [3995878](https://github.com/mikeal/request/commit/3995878d9fff18a8707f27ffeb4ed6401086adce) Support `key` and `cert` options (@mmalecki) -- [#433](https://github.com/mikeal/request/pull/433) Added support for HTTPS cert & key (@indexzero) -- [8b0f4e8](https://github.com/mikeal/request/commit/8b0f4e8fba33d578a891218201d87e3316ea9844) Released 2.14.0 (@mikeal) -- [54172c6](https://github.com/mikeal/request/commit/54172c68cab8360372e1e64e3fa14902662950bd) Rolling master version. (@mikeal) -- [aa4a285](https://github.com/mikeal/request/commit/aa4a28586354901b0c9b298a0aa79abb5ed175af) Add patch convenience method. (@mloar) -- [66501b9](https://github.com/mikeal/request/commit/66501b9872abc9a2065430cd5ed4a34dd45c8bee) protect against double callback (@spollack) -- [#444](https://github.com/mikeal/request/pull/444) protect against double callbacks on error path (@spollack) -- [#448](https://github.com/mikeal/request/pull/448) Convenience method for PATCH (@mloar) -- [6f0f8c5](https://github.com/mikeal/request/commit/6f0f8c5ee2b2fdc7118804664c2215fe9cb5a2f2) No longer doing bundle dependencies (@mikeal) -- [3997f98](https://github.com/mikeal/request/commit/3997f980722241c18454a00aeeda07d701c27a8f) No longer using bundle dependencies (@mikeal) -- [cba36ce](https://github.com/mikeal/request/commit/cba36ce64e68bd26e230b65f81256776ac66e686) Adding hawk signing to request. (@mikeal) -- [c7a8be6](https://github.com/mikeal/request/commit/c7a8be6d174eff05a9cb2fda987979e475d8543f) Fixing bug in empty options. (@mikeal) -- [67d753f](https://github.com/mikeal/request/commit/67d753fec99fa1f5a3b35ec0bbbc98896418d86c) node-uuid is much better. (@mikeal) -- [337718b](https://github.com/mikeal/request/commit/337718baa08cafb3e706d275fd7344a3c92363bb) Smarter test runner. (@mikeal) -- [bcc33ac](https://github.com/mikeal/request/commit/bcc33aca57baf6fe2a81fbf5983048c9220c71b1) Moved the cookie jar in to it's own module. (@mikeal) -- [3261be4](https://github.com/mikeal/request/commit/3261be4b5d6f45f62b9f50bec18af770cbb70957) Put aws signing in its own package. (@mikeal) -- [fbed723](https://github.com/mikeal/request/commit/fbed7234d7b532813105efdc4c54777396a6773b) OAuth signing is now in its own library. (@mikeal) -- [ef5ab90](https://github.com/mikeal/request/commit/ef5ab90277fb00d0e8eb1c565b0f6ef8c52601d3) Forever agent is now it's own package. (@mikeal) -- [ca1ed81](https://github.com/mikeal/request/commit/ca1ed813c62c7493dc77108b3efc907cc36930cb) tunneling agent is now it's own library. (@mikeal) -- [5c75621](https://github.com/mikeal/request/commit/5c75621ba5cea18bcf114117112121d361e5f3c9) Moving from main.js to index. cause it's not 2010 anymore. (@mikeal) -- [#413](https://github.com/mikeal/request/pull/413) rename googledoodle.png to .jpg (@nfriedly) -- [b4c4c28](https://github.com/mikeal/request/commit/b4c4c28424d906cd96a2131010b21d7facf8b666) Merge branch 'master' of github.com:mikeal/request (@nrn) -- [#310](https://github.com/mikeal/request/pull/310) Twitter Oauth Stuff Out of Date; Now Updated (@joemccann) -- [8b0e7e8](https://github.com/mikeal/request/commit/8b0e7e8c9d196d7286d1563aa54affcc4c8b0e1d) Comment to explain init() and start(). (@mikeal) -- [43d578d](https://github.com/mikeal/request/commit/43d578dc0206388eeae9584f540d550a06308fc8) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [b7c5ed4](https://github.com/mikeal/request/commit/b7c5ed48b618f71f138f9f08f8d705336f907e01) destroy the response if present when destroying the request (@mafintosh) -- [b279277](https://github.com/mikeal/request/commit/b279277dc2fb4b649640322980315d74db0d13f3) response.abort should be response.destroy (@mafintosh) -- [#454](https://github.com/mikeal/request/pull/454) Destroy the response if present when destroying the request (clean merge) (@mafintosh) -- [#429](https://github.com/mikeal/request/pull/429) Copy options before adding callback. (@nrn) -- [e0e0fb4](https://github.com/mikeal/request/commit/e0e0fb451f17945a02203639e4836aa327b4e30b) hawk 0.9.0 (@hueniverse) -- [#456](https://github.com/mikeal/request/pull/456) hawk 0.9.0 (@hueniverse) -- [2f60bc2](https://github.com/mikeal/request/commit/2f60bc253ff6e28df58a33da24b710b6d506849f) Fixes #453 (@mikeal) -- [805b6e4](https://github.com/mikeal/request/commit/805b6e4fe3afeeb407b4fca2e34e9caabe30f747) Fixing hawk README to match new usage. (@mikeal) -- [8feb957](https://github.com/mikeal/request/commit/8feb957911083bce552d1898b7ffcaa87104cd21) Removing old logref code. (@mikeal) -- [fcf6d67](https://github.com/mikeal/request/commit/fcf6d6765247a2645a233d95468ade2960294074) Safe stringify. (@mikeal) -- [62455bc](https://github.com/mikeal/request/commit/62455bca81e8760f25a2bf1dec2b06c8e915de79) hawk 0.10 (@hueniverse) -- [c361b41](https://github.com/mikeal/request/commit/c361b4140e7e6e4fe2a8f039951b65d54af65f42) hawk 0.10 (@hueniverse) -- [fa1ef30](https://github.com/mikeal/request/commit/fa1ef30dcdac83b271ce38c71975df0ed96b08f7) Strip the UTF8 BOM from a UTF encoded response (@kppullin) -- [9d636c0](https://github.com/mikeal/request/commit/9d636c0b3e882742e15ba989d0c2413f95364680) if query params are empty, then request path shouldn't end with a '?' (@jaipandya) -- [#462](https://github.com/mikeal/request/pull/462) if query params are empty, then request path shouldn't end with a '?' (merges cleanly now) (@jaipandya) -- [#460](https://github.com/mikeal/request/pull/460) hawk 0.10.0 (@hueniverse) -- [#461](https://github.com/mikeal/request/pull/461) Strip the UTF8 BOM from a UTF encoded response (@kppullin) -- [6d29ed7](https://github.com/mikeal/request/commit/6d29ed72e34f3b2b6d8a5cfadd96dd26b3dd246d) Moving response handlers to onResponse. (@mikeal) -- [885d6eb](https://github.com/mikeal/request/commit/885d6ebeb6130c2ab7624304f4a01a898573390b) Using querystring library from visionmedia (@kbackowski) -- [#471](https://github.com/mikeal/request/pull/471) Using querystring library from visionmedia (@kbackowski) -- [346bb42](https://github.com/mikeal/request/commit/346bb42898c5804576d9e9b3adf40123260bf73b) On strictSSL set rejectUnauthorized. (@mikeal) -- [8a45365](https://github.com/mikeal/request/commit/8a453656a705d2fa98fbf9092b1600d2ddadbb5a) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [32cfd3c](https://github.com/mikeal/request/commit/32cfd3cf7b3f23c2b1d36c5ccb475cbb3a4693ff) Style changes. (@mikeal) -- [ec07ee2](https://github.com/mikeal/request/commit/ec07ee2d3eeb90b6d0ad9f6d7f3a36da72276841) Print debug logs NODE_DEBUG=request in environment (@isaacs) -- [681af64](https://github.com/mikeal/request/commit/681af644a2ebccad8bcccb75984f7f10f909b382) Flow data in v0.10-style streams (@isaacs) -- [#473](https://github.com/mikeal/request/pull/473) V0.10 compat (@isaacs) -- [f07a8ba](https://github.com/mikeal/request/commit/f07a8baebf7001addbc0f7d7c869adddc21768ce) Release. (@mikeal) -- [1f947a1](https://github.com/mikeal/request/commit/1f947a1d2728147fbf4f57aa361d0bedcebfc206) Rolling master version. (@mikeal) -- [7a217bb](https://github.com/mikeal/request/commit/7a217bbdced9a05a786fe6534ab52734df342d3e) Reinstate querystring for `unescape` (@shimaore) -- [b0b4ca9](https://github.com/mikeal/request/commit/b0b4ca913e119337e9313a157eee2f08f77ddc38) Test for `unescape` (@shimaore) -- [#475](https://github.com/mikeal/request/pull/475) Use `unescape` from `querystring` (@shimaore) -- [28fc741](https://github.com/mikeal/request/commit/28fc741fa958a9783031189964ef6f6d7e3f3264) Release. (@mikeal) -- [d3e28ef](https://github.com/mikeal/request/commit/d3e28ef7144da4d9f22f8fb475bd5aa6a80fb947) Rolling master version. (@mikeal) -- [8f8bb9e](https://github.com/mikeal/request/commit/8f8bb9ee8c4dcd9eb815249fbe2a7cf54f61b56f) Changing so if Accept header is explicitly set, sending json does not overwrite. (@RoryH) -- [#479](https://github.com/mikeal/request/pull/479) Changing so if Accept header is explicitly set, sending json does not ov... (@RoryH) -- [7694372](https://github.com/mikeal/request/commit/7694372f3dc9d57ac29ca7ee5c00146aa5e1e747) Proper version for latest. (@mikeal) -- [aa208cf](https://github.com/mikeal/request/commit/aa208cf5c682262529d749f592db147182cacfaf) 0.8+ only now (@mikeal) -- [16b5ab9](https://github.com/mikeal/request/commit/16b5ab9151823067b05b382241483ef10811c3e1) Upgrading qs. (@mikeal) -- [7d10c1e](https://github.com/mikeal/request/commit/7d10c1e83b4663f592c773e7fece83435585a06f) Merge branch 'master' of github.com:mikeal/request (@mikeal) -- [b8ca4b4](https://github.com/mikeal/request/commit/b8ca4b474b8215cab44ef8ef789303571b3d016f) pumping hawk version. (@mikeal) -- [9c0e484](https://github.com/mikeal/request/commit/9c0e48430e3a9de8715e77c07c98301399eaf6e3) release (@mikeal) -- [a9f1896](https://github.com/mikeal/request/commit/a9f189697e2a813bee9bff31de32a25e99e55cf2) rolling master version. (@mikeal) -- [560a1f8](https://github.com/mikeal/request/commit/560a1f8b927099e44b75274375a690df2a05de67) Set content-type on input. (@mikeal) -- [5fec436](https://github.com/mikeal/request/commit/5fec436b6602bc8c76133664bca23e98f511b096) Release. (@mikeal) -- [88d8d5b](https://github.com/mikeal/request/commit/88d8d5bc80679b78a39cab8e6d8295728a0a150d) Rolling version. (@mikeal) -- [d05b6ba](https://github.com/mikeal/request/commit/d05b6ba72702c2411b4627d4d89190a5f2aba562) Empty body must be passed as empty string, exclude JSON case (@Olegas) -- [#490](https://github.com/mikeal/request/pull/490) Empty response body (3-rd argument) must be passed to callback as an empty string (@Olegas) -- [8aa13cd](https://github.com/mikeal/request/commit/8aa13cd5b5e22b24466ef0e59fa8b5f1d0f0795a) Added redirect event (@Cauldrath) -- [4d63a04](https://github.com/mikeal/request/commit/4d63a042553c90718bf0b90652921b26c52dcb31) Moving response emit above setHeaders on destination streams (@kenperkins) -- [#498](https://github.com/mikeal/request/pull/498) Moving response emit above setHeaders on destination streams (@kenperkins) -- [c40993f](https://github.com/mikeal/request/commit/c40993fc987b1a8a3cb08cd5699b2f1b2bd4b28b) Fix a regression introduced by cba36ce6 (@nylen) -- [edc2e17](https://github.com/mikeal/request/commit/edc2e17e8154239efa6bd2914435798c18882635) Don't delete headers when retrying a request with proper authentication (@nylen) -- [a375ac1](https://github.com/mikeal/request/commit/a375ac15460f4f3b679f4418d7fc467a5cc94499) Refactor and expand basic auth tests (@nylen) -- [9bc28bf](https://github.com/mikeal/request/commit/9bc28bf912fb0afdd14b36b0ccbafb185a32546a) Cleanup whitespace. (@mikeal) -- [9a35cd2](https://github.com/mikeal/request/commit/9a35cd2248d9492b099c7ee46d68ca017b6a701c) Fix basic auth for passwords that contain colons (@tonistiigi) -- [f724810](https://github.com/mikeal/request/commit/f724810c7b9f82fa1423d0a4d19fcb5aaca98137) Honor the .strictSSL option when using proxies (tunnel-agent) (@jhs) -- [95a2558](https://github.com/mikeal/request/commit/95a25580375be1b9c39cc2e88a36a8387395bc13) Add HTTP Signature support. (@davidlehn) -- [921c973](https://github.com/mikeal/request/commit/921c973015721ee0f92ed670f5e88bca057104cc) * Make password optional to support the format: http://username@hostname/ -- [2759ebb](https://github.com/mikeal/request/commit/2759ebbe07e8563fd3ded698d2236309fb28176b) add 'localAddress' support (@yyfrankyy) -- [#513](https://github.com/mikeal/request/pull/513) add 'localAddress' support (@yyfrankyy) -- [#512](https://github.com/mikeal/request/pull/512) Make password optional to support the format: http://username@hostname/ (@pajato1) -- [#508](https://github.com/mikeal/request/pull/508) Honor the .strictSSL option when using proxies (tunnel-agent) (@iriscouch) -- [5f036e6](https://github.com/mikeal/request/commit/5f036e6f5d3102a89e5401a53090a0627a7850a8) Conflicts: index.js (@nylen) -- [89d2602](https://github.com/mikeal/request/commit/89d2602ef4e3a4e6e51284f6a29b5767c79ffaba) Conflicts: README.md (@davidlehn) -- [#502](https://github.com/mikeal/request/pull/502) Fix POST (and probably other) requests that are retried after 401 Unauthorized (@nylen) -- [eb3e033](https://github.com/mikeal/request/commit/eb3e033170403832fe7070955db32112ec46005f) Merge branch 'master' of git://github.com/mikeal/request (@davidlehn) -- [#510](https://github.com/mikeal/request/pull/510) Add HTTP Signature support. (@digitalbazaar) -- [227d998](https://github.com/mikeal/request/commit/227d9985426214b6ac68702933346000298d7790) Update the internal path variable when querystring is changed (@jblebrun) -- [#519](https://github.com/mikeal/request/pull/519) Update internal path state on post-creation QS changes (@incredible-labs) -- [428b9c1](https://github.com/mikeal/request/commit/428b9c1ad9831b7dfd6cec4ce68df358590c6d65) Fixing test-tunnel.js (@noway421) -- [2417599](https://github.com/mikeal/request/commit/24175993f6c362f7fca5965feb0a11756f00baf3) Improving test-localAddress.js (@noway421) -- [#520](https://github.com/mikeal/request/pull/520) Fixing test-tunnel.js (@noway421) -- [1e37f1b](https://github.com/mikeal/request/commit/1e37f1bea45174e09e6450bc71dfc081c8cd94de) Some explaining comments (@noway421) -- [909b024](https://github.com/mikeal/request/commit/909b024619c9e47f615749661d610cccd8421d80) Updating dependencies (@noway421) -- [#523](https://github.com/mikeal/request/pull/523) Updating dependencies (@noway421) -- [47191e1](https://github.com/mikeal/request/commit/47191e1a5e29714fb0c5f8b2162b2971570df644) 2.17.0 (@mikeal) -- [14def5a](https://github.com/mikeal/request/commit/14def5af5903d03f66bd6c9be534e6b76f47c063) 2.18.0 (@mikeal) -- [56fd6b7](https://github.com/mikeal/request/commit/56fd6b7ec6da162894df0809126d688f30900d25) 2.18.1 (@mikeal) -- [37dd689](https://github.com/mikeal/request/commit/37dd68989670f8937b537579a4299d9649b8aa16) Fixing dep. (@mikeal) -- [dd7209a](https://github.com/mikeal/request/commit/dd7209a84dd40afe87db31c6ab66885e2015cb8f) 2.19.0 (@mikeal) -- [62f3b92](https://github.com/mikeal/request/commit/62f3b9203690d4ad34486fc506fc78a1c9971e03) 2.19.1 (@mikeal) -- [74c6b2e](https://github.com/mikeal/request/commit/74c6b2e315872980ee9a9a000d25e724138f28b1) Adding test for onelineproxy. (@mikeal) -- [2a01cc0](https://github.com/mikeal/request/commit/2a01cc082f544647f7176a992e02668519a694be) Fixing onelineproxy. (@mikeal) -- [8b4c920](https://github.com/mikeal/request/commit/8b4c9203adb372f2ee99b1b012406b482b27c68d) 2.20.0 (@mikeal) -- [d8d4a33](https://github.com/mikeal/request/commit/d8d4a3311d8d31df88fa8a2ab3265872e5cb97ae) 2.20.1 (@mikeal) -- [5937012](https://github.com/mikeal/request/commit/59370123b22e8c971e4ee48c3d0caf920d890bda) dependencies versions bump (@jodaka) -- [#529](https://github.com/mikeal/request/pull/529) dependencies versions bump (@jodaka) -- [#521](https://github.com/mikeal/request/pull/521) Improving test-localAddress.js (@noway421) -- [#503](https://github.com/mikeal/request/pull/503) Fix basic auth for passwords that contain colons (@tonistiigi) -- [#497](https://github.com/mikeal/request/pull/497) Added redirect event (@Cauldrath) -- [297a9ea](https://github.com/mikeal/request/commit/297a9ea827655e5fb406a86907bb0d89b01deae8) fix typo (@fredericosilva) -- [#532](https://github.com/mikeal/request/pull/532) fix typo (@fredericosilva) -- [3691db5](https://github.com/mikeal/request/commit/3691db5a2d0981d4aeabfda5b988a5c69074e187) Allow explicitly empty user field for basic authentication. (@mikeando) -- [#536](https://github.com/mikeal/request/pull/536) Allow explicitly empty user field for basic authentication. (@mikeando) -- [5d36e32](https://github.com/mikeal/request/commit/5d36e324047f79cbbf3bb9b71fef633f02b36367) 2.21.0 (@mikeal) -- [9bd98d6](https://github.com/mikeal/request/commit/9bd98d6052f222aa348635c1acb2e2c99eed0f8c) 2.21.1 (@mikeal) -- [a918e04](https://github.com/mikeal/request/commit/a918e04a8d767a2948567ea29ed3fdd1650c16b1) The exported request function doesn't have an auth method (@tschaub) -- [1ebe1ac](https://github.com/mikeal/request/commit/1ebe1ac2f78e8a6149c03ce68fcb23d56df2316e) exposing Request class (@regality) -- [#542](https://github.com/mikeal/request/pull/542) Expose Request class (@ifit) -- [467573d](https://github.com/mikeal/request/commit/467573d17b4db5f93ed425ace0594370a7820c7c) Update http-signatures version. (@davidlehn) -- [#541](https://github.com/mikeal/request/pull/541) The exported request function doesn't have an auth method (@tschaub) -- [3040bbe](https://github.com/mikeal/request/commit/3040bbe5de846811151dab8dc09944acc93a338e) Fix redirections, (@criloz) -- [#564](https://github.com/mikeal/request/pull/564) Fix redirections (@NebTex) -- [397b435](https://github.com/mikeal/request/commit/397b4350fcf885460d7dced94cf1db1f5c167f80) handle ciphers and secureOptions in agentOptions (@SamPlacette) -- [65a2778](https://github.com/mikeal/request/commit/65a27782db7d2798b6490ea08efacb8f3b0a401c) tests and fix for null agentOptions case (@SamPlacette) -- [#568](https://github.com/mikeal/request/pull/568) use agentOptions to create agent when specified in request (@SamPlacette) -- [c116920](https://github.com/mikeal/request/commit/c116920a2cbef25afe2e1bbcf4df074e1e2f9dbb) Let's see how we do with only the main guard. (@mikeal) -- [f54a335](https://github.com/mikeal/request/commit/f54a3358119298634a7b0c29a21bf1471fc23d98) Fix spelling of "ignoring." (@bigeasy) -- [5cd215f](https://github.com/mikeal/request/commit/5cd215f327e113dc6c062634e405c577986cfd3c) Change isUrl regex to accept mixed case (@lexander) -- [02c8e74](https://github.com/mikeal/request/commit/02c8e749360a47d45e3e7b51b7f751fe498d2f25) #583 added tests for isUrl regex change. (@lexander) -- [#581](https://github.com/mikeal/request/pull/581) Fix spelling of "ignoring." (@bigeasy) -- [#544](https://github.com/mikeal/request/pull/544) Update http-signature version. (@digitalbazaar) -- [e77746b](https://github.com/mikeal/request/commit/e77746bf42e974dc91a84d03f44f750dd7ee0989) global cookie jar disabled by default, send jar: true to enable. (@threepointone) -- [46015ac](https://github.com/mikeal/request/commit/46015ac8d5b74f8107a6ec9fd07c133f46c5d833) 2.22.0 (@mikeal) -- [e5da4a5](https://github.com/mikeal/request/commit/e5da4a5e1a20bf4f23681f7b996f22c5fadae91d) 2.22.1 (@mikeal) -- [#587](https://github.com/mikeal/request/pull/587) Global cookie jar disabled by default (@threepointone) -- [fac9da1](https://github.com/mikeal/request/commit/fac9da1cc426bf0a4bcc5f0b7d0d0aea8b1cce38) Prevent setting headers after they are sent (@wpreul) -- [#589](https://github.com/mikeal/request/pull/589) Prevent setting headers after they are sent (@wpreul) -- [bc1537a](https://github.com/mikeal/request/commit/bc1537ab79064cea532b0d14110ce4e49a663bde) Emit complete event when there is no callback -- [de8508e](https://github.com/mikeal/request/commit/de8508e9feac10563596aeee26727567b3c2e33c) Added check to see if the global pool is being used before using the global agent (@Cauldrath) -- [03441ef](https://github.com/mikeal/request/commit/03441ef919e51a742aaf9e168d917e97e2d9eb6b) 2.23.0 (@mikeal) diff --git a/packages/wekan-request/LICENSE b/packages/wekan-request/LICENSE deleted file mode 100644 index a4a9aee0c..000000000 --- a/packages/wekan-request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/packages/wekan-request/README.md b/packages/wekan-request/README.md deleted file mode 100644 index 4b416932e..000000000 --- a/packages/wekan-request/README.md +++ /dev/null @@ -1,421 +0,0 @@ -# Request -- Simplified HTTP client - -[![NPM](https://nodei.co/npm/request.png)](https://nodei.co/npm/request/) - -## Super simple to use - -Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. - -```javascript -var request = require('request'); -request('http://www.google.com', function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body) // Print the google web page. - } -}) -``` - -## Streaming - -You can stream any response to a file stream. - -```javascript -request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) -``` - -You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one). - -```javascript -fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) -``` - -Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers. - -```javascript -request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) -``` - -Now let’s get fancy. - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - if (req.method === 'PUT') { - req.pipe(request.put('http://mysite.com/doodle.png')) - } else if (req.method === 'GET' || req.method === 'HEAD') { - request.get('http://mysite.com/doodle.png').pipe(resp) - } - } -}) -``` - -You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do: - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - var x = request('http://mysite.com/doodle.png') - req.pipe(x) - x.pipe(resp) - } -}) -``` - -And since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :) - -```javascript -req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) -``` - -Also, none of this new functionality conflicts with requests previous features, it just expands them. - -```javascript -var r = request.defaults({'proxy':'http://localproxy.com'}) - -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - r.get('http://google.com/doodle.png').pipe(resp) - } -}) -``` - -You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. - -## UNIX Socket - -`request` supports the `unix://` protocol for all requests. The path is assumed to be absolute to the root of the host file system. - -HTTP paths are extracted from the supplied URL by testing each level of the full URL against net.connect for a socket response. - -Thus the following request will GET `/httppath` from the HTTP server listening on `/tmp/unix.socket` - -```javascript -request.get('unix://tmp/unix.socket/httppath') -``` - -## Forms - -`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. - -URL-encoded forms are simple. - -```javascript -request.post('http://service.com/upload', {form:{key:'value'}}) -// or -request.post('http://service.com/upload').form({key:'value'}) -``` - -For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don’t need to worry about piping the form object or setting the headers, `request` will handle that for you. - -```javascript -var r = request.post('http://service.com/upload', function optionalCallback (err, httpResponse, body) { - if (err) { - return console.error('upload failed:', err); - } - console.log('Upload successful! Server responded with:', body); -}) -var form = r.form() -form.append('my_field', 'my_value') -form.append('my_buffer', new Buffer([1, 2, 3])) -form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))) -form.append('remote_file', request('http://google.com/doodle.png')) - -// Just like always, `r` is a writable stream, and can be used as such (you have until nextTick to pipe it, etc.) -// Alternatively, you can provide a callback (that's what this example does-- see `optionalCallback` above). -``` - -## HTTP Authentication - -```javascript -request.get('http://some.server.com/').auth('username', 'password', false); -// or -request.get('http://some.server.com/', { - 'auth': { - 'user': 'username', - 'pass': 'password', - 'sendImmediately': false - } -}); -// or -request.get('http://some.server.com/').auth(null, null, true, 'bearerToken'); -// or -request.get('http://some.server.com/', { - 'auth': { - 'bearer': 'bearerToken' - } -}); -``` - -If passed as an option, `auth` should be a hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional). The method form takes parameters `auth(username, password, sendImmediately)`. - -`sendImmediately` defaults to `true`, which causes a basic authentication header to be sent. If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a `401` response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method). - -Note that you can also use for basic authentication a trick using the URL itself, as specified in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt). -Simply pass the `user:password` before the host with an `@` sign. - -```javascript -var username = 'username', - password = 'password', - url = 'http://' + username + ':' + password + '@some.server.com'; - -request({url: url}, function (error, response, body) { - // Do more stuff with 'body' here -}); -``` - -Digest authentication is supported, but it only works with `sendImmediately` set to `false`; otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail. - -Bearer authentication is supported, and is activated when the `bearer` value is available. The value may be either a `String` or a `Function` returning a `String`. Using a function to supply the bearer token is particularly useful if used in conjuction with `defaults` to allow a single function to supply the last known token at the time or sending a request or to compute one on the fly. - -## OAuth Signing - -```javascript -// Twitter OAuth -var qs = require('querystring') - , oauth = - { callback: 'http://mysite.com/callback/' - , consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - } - , url = 'https://api.twitter.com/oauth/request_token' - ; -request.post({url:url, oauth:oauth}, function (e, r, body) { - // Ideally, you would take the body in the response - // and construct a URL that a user clicks on (like a sign in button). - // The verifier is only available in the response after a user has - // verified with twitter that they are authorizing your app. - var access_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: access_token.oauth_token - , verifier: access_token.oauth_verifier - } - , url = 'https://api.twitter.com/oauth/access_token' - ; - request.post({url:url, oauth:oauth}, function (e, r, body) { - var perm_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: perm_token.oauth_token - , token_secret: perm_token.oauth_token_secret - } - , url = 'https://api.twitter.com/1.1/users/show.json?' - , params = - { screen_name: perm_token.screen_name - , user_id: perm_token.user_id - } - ; - url += qs.stringify(params) - request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { - console.log(user) - }) - }) -}) -``` - -### Custom HTTP Headers - -HTTP Headers, such as `User-Agent`, can be set in the `options` object. -In the example below, we call the github API to find out the number -of stars and forks for the request repository. This requires a -custom `User-Agent` header as well as https. - -```javascript -var request = require('request'); - -var options = { - url: 'https://api.github.com/repos/mikeal/request', - headers: { - 'User-Agent': 'request' - } -}; - -function callback(error, response, body) { - if (!error && response.statusCode == 200) { - var info = JSON.parse(body); - console.log(info.stargazers_count + " Stars"); - console.log(info.forks_count + " Forks"); - } -} - -request(options, callback); -``` - -### request(options, callback) - -The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional. - -* `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()` -* `qs` - object containing querystring values to be appended to the `uri` -* `method` - http method (default: `"GET"`) -* `headers` - http headers (default: `{}`) -* `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer` or `String`. -* `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no options, a `FormData` instance is returned (and is piped to request). -* `auth` - A hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional). See documentation above. -* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as JSON. -* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. -* `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`) -* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`) -* `maxRedirects` - the maximum number of redirects to follow (default: `10`) -* `encoding` - Encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. -* `pool` - A hash object containing the agents for these requests. If omitted, the request will use the global pool (which is set to node's default `maxSockets`) -* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. -* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request -* `proxy` - An HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`) -* `oauth` - Options for OAuth HMAC-SHA1 signing. See documentation above. -* `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example). -* `strictSSL` - If `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option. -* `jar` - If `true` and `tough-cookie` is installed, remember cookies for future use (or define your custom cookie jar; see examples section) -* `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`. Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services) -* `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options. -* `localAddress` - Local interface to bind for network connections. -* `gzip` - If `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response. - - -The callback argument gets 3 arguments: - -1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object) -2. An [`http.IncomingMessage`](http://nodejs.org/api/http.html#http_http_incomingmessage) object -3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied) - -## Convenience methods - -There are also shorthand methods for different HTTP METHODs and some other conveniences. - -### request.defaults(options) - -This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. - -### request.put - -Same as `request()`, but defaults to `method: "PUT"`. - -```javascript -request.put(url) -``` - -### request.patch - -Same as `request()`, but defaults to `method: "PATCH"`. - -```javascript -request.patch(url) -``` - -### request.post - -Same as `request()`, but defaults to `method: "POST"`. - -```javascript -request.post(url) -``` - -### request.head - -Same as request() but defaults to `method: "HEAD"`. - -```javascript -request.head(url) -``` - -### request.del - -Same as `request()`, but defaults to `method: "DELETE"`. - -```javascript -request.del(url) -``` - -### request.get - -Same as `request()` (for uniformity). - -```javascript -request.get(url) -``` -### request.cookie - -Function that creates a new cookie. - -```javascript -request.cookie('cookie_string_here') -``` -### request.jar - -Function that creates a new cookie jar. - -```javascript -request.jar() -``` - - -## Examples: - -```javascript - var request = require('request') - , rand = Math.floor(Math.random()*100000000).toString() - ; - request( - { method: 'PUT' - , uri: 'http://mikeal.iriscouch.com/testjs/' + rand - , multipart: - [ { 'content-type': 'application/json' - , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) - } - , { body: 'I am an attachment' } - ] - } - , function (error, response, body) { - if(response.statusCode == 201){ - console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) - } else { - console.log('error: '+ response.statusCode) - console.log(body) - } - } - ) -``` - -Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`) and install `tough-cookie`. - -```javascript -var request = request.defaults({jar: true}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -To use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`) - -```javascript -var j = request.jar() -var request = request.defaults({jar:j}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -OR - -```javascript -// `npm install --save tough-cookie` before this works -var j = request.jar() -var cookie = request.cookie('your_cookie_here') -j.setCookie(cookie, uri); -request({url: 'http://www.google.com', jar: j}, function () { - request('http://images.google.com') -}) -``` - -To inspect your cookie jar after a request - -```javascript -var j = request.jar() -request({url: 'http://www.google.com', jar: j}, function () { - var cookie_string = j.getCookieString(uri); // "key1=value1; key2=value2; ..." - var cookies = j.getCookies(uri); - // [{key: 'key1', value: 'value1', domain: "www.google.com", ...}, ...] -}) -``` diff --git a/packages/wekan-request/index.js b/packages/wekan-request/index.js deleted file mode 100755 index 4b95008d1..000000000 --- a/packages/wekan-request/index.js +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2010-2012 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -var cookies = require('./lib/cookies') - , copy = require('./lib/copy') - , Request = require('./request') - , util = require('util') - ; - - - -// organize params for patch, post, put, head, del -function initParams(uri, options, callback) { - var opts; - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - opts = util._extend({}, options); - opts.uri = uri - } else if (typeof uri === 'string') { - opts = {uri:uri} - } else { - opts = util._extend({}, uri); - uri = opts.uri - } - - return { uri: uri, options: opts, callback: callback } -} - -function request (uri, options, callback) { - var opts; - if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - opts = util._extend({}, options); - opts.uri = uri - } else if (typeof uri === 'string') { - opts = {uri:uri} - } else { - opts = util._extend({}, uri); - } - - if (callback) opts.callback = callback - var r = new Request(opts) - return r -} - -module.exports = request - -request.Request = Request; - -request.debug = process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG) - -request.initParams = initParams - -request.defaults = function (options, requester) { - var def = function (method) { - var d = function (uri, opts, callback) { - var params = initParams(uri, opts, callback) - Object.keys(options).forEach(function (key) { - if (key !== 'headers' && params.options[key] === undefined) { - params.options[key] = options[key] - } - }) - if (options.headers) { - var headers = {} - util._extend(headers, options.headers) - util._extend(headers, params.options.headers) - params.options.headers = headers - } - if(typeof requester === 'function') { - if(method === request) { - method = requester - } else { - params.options._requester = requester - } - } - return method(params.options, params.callback) - } - return d - } - var de = def(request) - de.get = def(request.get) - de.patch = def(request.patch) - de.post = def(request.post) - de.put = def(request.put) - de.head = def(request.head) - de.del = def(request.del) - de.cookie = def(request.cookie) - de.jar = request.jar - return de -} - -function requester(params) { - if(typeof params.options._requester === 'function') { - return params.options._requester - } else { - return request - } -} - -request.forever = function (agentOptions, optionsArg) { - var options = {} - if (optionsArg) { - for (var option in optionsArg) { - options[option] = optionsArg[option] - } - } - if (agentOptions) options.agentOptions = agentOptions - options.forever = true - return request.defaults(options) -} - -request.get = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'GET' - return requester(params)(params.uri || null, params.options, params.callback) -} -request.post = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'POST' - return requester(params)(params.uri || null, params.options, params.callback) -} -request.put = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'PUT' - return requester(params)(params.uri || null, params.options, params.callback) -} -request.patch = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'PATCH' - return requester(params)(params.uri || null, params.options, params.callback) -} -request.head = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'HEAD' - if (params.options.body || - params.options.requestBodyStream || - (params.options.json && typeof params.options.json !== 'boolean') || - params.options.multipart) { - throw new Error("HTTP HEAD requests MUST NOT include a request body.") - } - - return requester(params)(params.uri || null, params.options, params.callback) -} -request.del = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'DELETE' - return requester(params)(params.uri || null, params.options, params.callback) -} -request.jar = function () { - return cookies.jar(); -} -request.cookie = function (str) { - return cookies.parse(str); -} diff --git a/packages/wekan-request/lib/cookies.js b/packages/wekan-request/lib/cookies.js deleted file mode 100644 index 7e61c62bc..000000000 --- a/packages/wekan-request/lib/cookies.js +++ /dev/null @@ -1,40 +0,0 @@ -var optional = require('./optional') - , tough = optional('tough-cookie') - , Cookie = tough && tough.Cookie - , CookieJar = tough && tough.CookieJar - ; - -exports.parse = function(str) { - if (str && str.uri) str = str.uri - if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") - if (!Cookie) { - return null; - } - return Cookie.parse(str) -}; - -// Adapt the sometimes-Async api of tough.CookieJar to our requirements -function RequestJar() { - this._jar = new CookieJar(); -} -RequestJar.prototype.setCookie = function(cookieOrStr, uri, options) { - return this._jar.setCookieSync(cookieOrStr, uri, options || {}); -}; -RequestJar.prototype.getCookieString = function(uri) { - return this._jar.getCookieStringSync(uri); -}; -RequestJar.prototype.getCookies = function(uri) { - return this._jar.getCookiesSync(uri); -}; - -exports.jar = function() { - if (!CookieJar) { - // tough-cookie not loaded, return a stub object: - return { - setCookie: function(){}, - getCookieString: function(){}, - getCookies: function(){} - }; - } - return new RequestJar(); -}; diff --git a/packages/wekan-request/lib/copy.js b/packages/wekan-request/lib/copy.js deleted file mode 100644 index 56831ff80..000000000 --- a/packages/wekan-request/lib/copy.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = -function copy (obj) { - var o = {} - Object.keys(obj).forEach(function (i) { - o[i] = obj[i] - }) - return o -} \ No newline at end of file diff --git a/packages/wekan-request/lib/debug.js b/packages/wekan-request/lib/debug.js deleted file mode 100644 index fa27b24b6..000000000 --- a/packages/wekan-request/lib/debug.js +++ /dev/null @@ -1,7 +0,0 @@ -var util = require('util') - -module.exports = -function debug () { - if (/\brequest\b/.test(process.env.NODE_DEBUG)) - console.error('REQUEST %s', util.format.apply(util, arguments)) -} diff --git a/packages/wekan-request/lib/getSafe.js b/packages/wekan-request/lib/getSafe.js deleted file mode 100644 index 28e07ea56..000000000 --- a/packages/wekan-request/lib/getSafe.js +++ /dev/null @@ -1,34 +0,0 @@ -// Safe toJSON -module.exports = -function getSafe (self, uuid) { - if (typeof self === 'object' || typeof self === 'function') var safe = {} - if (Array.isArray(self)) var safe = [] - - var recurse = [] - - Object.defineProperty(self, uuid, {}) - - var attrs = Object.keys(self).filter(function (i) { - if (i === uuid) return false - if ( (typeof self[i] !== 'object' && typeof self[i] !== 'function') || self[i] === null) return true - return !(Object.getOwnPropertyDescriptor(self[i], uuid)) - }) - - - for (var i=0;i<attrs.length;i++) { - if ( (typeof self[attrs[i]] !== 'object' && typeof self[attrs[i]] !== 'function') || - self[attrs[i]] === null - ) { - safe[attrs[i]] = self[attrs[i]] - } else { - recurse.push(attrs[i]) - Object.defineProperty(self[attrs[i]], uuid, {}) - } - } - - for (var i=0;i<recurse.length;i++) { - safe[recurse[i]] = getSafe(self[recurse[i]], uuid) - } - - return safe -} \ No newline at end of file diff --git a/packages/wekan-request/lib/optional.js b/packages/wekan-request/lib/optional.js deleted file mode 100644 index 0c4fe8533..000000000 --- a/packages/wekan-request/lib/optional.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = function(module) { - try { - return require(module); - } catch (e) {} -}; diff --git a/packages/wekan-request/package.json b/packages/wekan-request/package.json deleted file mode 100755 index df8b6bb2c..000000000 --- a/packages/wekan-request/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "wekan-request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.39.1", - "author": "Mikeal Rogers <mikeal.rogers@gmail.com>", - "repository": { - "type": "git", - "url": "https://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "license": "Apache-2.0", - "engines": [ - "node >= 0.8.0" - ], - "main": "index.js", - "dependencies": { - "qs": ">=0.6.4", - "json-stringify-safe": "~5.0.0", - "mime-types": "~1.0.1", - "forever-agent": "~0.5.0", - "node-uuid": "~1.4.0" - }, - "optionalDependencies": { - "tough-cookie": ">=0.12.0", - "form-data": "~0.1.0", - "tunnel-agent": "~0.4.0", - "http-signature": "~0.10.0", - "oauth-sign": "~0.3.0", - "hawk": "1.1.1", - "aws-sign2": "~0.5.0", - "stringstream": "~0.0.4" - }, - "scripts": { - "test": "node tests/run.js" - } -} diff --git a/packages/wekan-request/request.js b/packages/wekan-request/request.js deleted file mode 100644 index 90847b16c..000000000 --- a/packages/wekan-request/request.js +++ /dev/null @@ -1,1442 +0,0 @@ -var optional = require('./lib/optional') - , http = require('http') - , https = optional('https') - , tls = optional('tls') - , url = require('url') - , util = require('util') - , stream = require('stream') - , qs = require('qs') - , querystring = require('querystring') - , crypto = require('crypto') - , zlib = require('zlib') - - , oauth = optional('oauth-sign') - , hawk = optional('hawk') - , aws = optional('aws-sign2') - , httpSignature = optional('http-signature') - , uuid = require('node-uuid') - , mime = require('mime-types') - , tunnel = optional('tunnel-agent') - , _safeStringify = require('json-stringify-safe') - , stringstream = optional('stringstream') - - , ForeverAgent = require('forever-agent') - , FormData = optional('form-data') - - , cookies = require('./lib/cookies') - , globalCookieJar = cookies.jar() - - , copy = require('./lib/copy') - , debug = require('./lib/debug') - , getSafe = require('./lib/getSafe') - , net = require('net') - ; - -function safeStringify (obj) { - var ret - try { ret = JSON.stringify(obj) } - catch (e) { ret = _safeStringify(obj) } - return ret -} - -var globalPool = {} -var isUrl = /^https?:|^unix:/ - - -// Hacky fix for pre-0.4.4 https -if (https && !https.Agent) { - https.Agent = function (options) { - http.Agent.call(this, options) - } - util.inherits(https.Agent, http.Agent) - https.Agent.prototype._getConnection = function (host, port, cb) { - var s = tls.connect(port, host, this.options, function () { - // do other checks here? - if (cb) cb() - }) - return s - } -} - -function isReadStream (rs) { - return rs.readable && rs.path && rs.mode; -} - -function toBase64 (str) { - return (new Buffer(str || "", "ascii")).toString("base64") -} - -function md5 (str) { - return crypto.createHash('md5').update(str).digest('hex') -} - -function Request (options) { - stream.Stream.call(this) - this.readable = true - this.writable = true - - if (typeof options === 'string') { - options = {uri:options} - } - - var reserved = Object.keys(Request.prototype) - for (var i in options) { - if (reserved.indexOf(i) === -1) { - this[i] = options[i] - } else { - if (typeof options[i] === 'function') { - delete options[i] - } - } - } - - if (options.method) { - this.explicitMethod = true - } - - this.canTunnel = options.tunnel !== false && tunnel; - - this.init(options) -} -util.inherits(Request, stream.Stream) -Request.prototype.init = function (options) { - // init() contains all the code to setup the request object. - // the actual outgoing request is not started until start() is called - // this function is called from both the constructor and on redirect. - var self = this - if (!options) options = {} - - if (!self.method) self.method = options.method || 'GET' - self.localAddress = options.localAddress - - debug(options) - if (!self.pool && self.pool !== false) self.pool = globalPool - self.dests = self.dests || [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) return // Print a warning maybe? - self._callbackCalled = true - self._callback.apply(self, arguments) - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - if (self.url && !self.uri) { - // People use this property instead all the time so why not just support it. - self.uri = self.url - delete self.url - } - - if (!self.uri) { - // this will throw if unhandled but is handleable when in a redirect - return self.emit('error', new Error("options.uri is a required argument")) - } else { - if (typeof self.uri == "string") self.uri = url.parse(self.uri) - } - - if (self.strictSSL === false) { - self.rejectUnauthorized = false - } - - if(!self.hasOwnProperty('proxy')) { - // check for HTTP(S)_PROXY environment variables - if(self.uri.protocol == "http:") { - self.proxy = process.env.HTTP_PROXY || process.env.http_proxy || null; - } else if(self.uri.protocol == "https:") { - self.proxy = process.env.HTTPS_PROXY || process.env.https_proxy || - process.env.HTTP_PROXY || process.env.http_proxy || null; - } - } - - if (self.proxy) { - if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) - - // do the HTTP CONNECT dance using koichik/node-tunnel - if (http.globalAgent && self.uri.protocol === "https:" && self.canTunnel) { - var tunnelFn = self.proxy.protocol === "http:" - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - - var tunnelOptions = { proxy: { host: self.proxy.hostname - , port: +self.proxy.port - , proxyAuth: self.proxy.auth - , headers: { Host: self.uri.hostname + ':' + - (self.uri.port || self.uri.protocol === 'https:' ? 443 : 80) }} - , rejectUnauthorized: self.rejectUnauthorized - , ca: this.ca - , cert:this.cert - , key: this.key} - - self.agent = tunnelFn(tunnelOptions) - self.tunnel = true - } - } - - if (!self.uri.pathname) {self.uri.pathname = '/'} - - if (!self.uri.host && !self.protocol=='unix:') { - // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (they didn't call request directly with this URL) - // they should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - self.emit('error', new Error(message)) - return // This error was fatal - } - - self._redirectsFollowed = self._redirectsFollowed || 0 - self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 - self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true - self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false - if (self.followRedirect || self.followAllRedirects) - self.redirects = self.redirects || [] - - self.headers = self.headers ? copy(self.headers) : {} - - self.setHost = false - if (!self.hasHeader('host')) { - self.setHeader('host', self.uri.hostname) - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) - self.setHeader('host', self.getHeader('host') + (':'+self.uri.port) ) - } - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.port) { - if (self.uri.protocol == 'http:') {self.uri.port = 80} - else if (self.uri.protocol == 'https:') {self.uri.port = 443} - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - self.clientErrorHandler = function (error) { - if (self._aborted) return - if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' - && self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) - } - - self._parserErrorHandler = function (error) { - if (this.res) { - if (this.res.request) { - this.res.request.emit('error', error) - } else { - this.res.emit('error', error) - } - } else { - this._httpMessage.emit('error', error) - } - } - - self._buildRequest = function(){ - var self = this; - - if (options.form) { - self.form(options.form) - } - - if (options.qs) self.qs(options.qs) - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || "") - } - - if (self.path.length === 0) self.path = '/' - - - // Auth must happen last in case signing is dependent on other headers - if (options.oauth) { - self.oauth(options.oauth) - } - - if (options.aws) { - self.aws(options.aws) - } - - if (options.hawk) { - self.hawk(options.hawk) - } - - if (options.httpSignature) { - self.httpSignature(options.httpSignature) - } - - if (options.auth) { - if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) options.auth.user = options.auth.username - if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) options.auth.pass = options.auth.password - - self.auth( - options.auth.user, - options.auth.pass, - options.auth.sendImmediately, - options.auth.bearer - ) - } - - if (self.gzip && !self.hasHeader('accept-encoding')) { - self.setHeader('accept-encoding', 'gzip') - } - - if (self.uri.auth && !self.hasHeader('authorization')) { - var authPieces = self.uri.auth.split(':').map(function(item){ return querystring.unescape(item) }) - self.auth(authPieces[0], authPieces.slice(1).join(':'), true) - } - if (self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization') && !self.tunnel) { - self.setHeader('proxy-authorization', "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return querystring.unescape(item)}).join(':'))) - } - - - if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - - if (options.json) { - self.json(options.json) - } else if (options.multipart) { - self.boundary = uuid() - self.multipart(options.multipart) - } - - if (self.body) { - var length = 0 - if (!Buffer.isBuffer(self.body)) { - if (Array.isArray(self.body)) { - for (var i = 0; i < self.body.length; i++) { - length += self.body[i].length - } - } else { - self.body = new Buffer(self.body) - length = self.body.length - } - } else { - length = self.body.length - } - if (length) { - if (!self.hasHeader('content-length')) self.setHeader('content-length', length) - } else { - throw new Error('Argument error, options.body.') - } - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - , defaultModules = {'http:':http, 'https:':https, 'unix:':http} - , httpModules = self.httpModules || {} - ; - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) return this.emit('error', new Error("Invalid protocol: " + protocol)) - - if (options.ca) self.ca = options.ca - - if (!self.agent) { - if (options.agentOptions) self.agentOptions = options.agentOptions - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getAgent() - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.pool.maxSockets - } - } - - self.on('pipe', function (src) { - if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.") - self.src = src - if (isReadStream(src)) { - if (!self.hasHeader('content-type')) self.setHeader('content-type', mime.lookup(src.path)) - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.hasHeader(i)) { - self.setHeader(i, src.headers[i]) - } - } - } - if (self._json && !self.hasHeader('content-type')) - self.setHeader('content-type', 'application/json') - if (src.method && !self.explicitMethod) { - self.method = src.method - } - } - - // self.on('pipe', function () { - // console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") - // }) - }) - - process.nextTick(function () { - if (self._aborted) return - - var end = function () { - if (self._form) { - self._form.pipe(self) - } - if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.setHeader('content-length', 0) - } - self.end() - } - } - - if (self._form && !self.hasHeader('content-length')) { - // Before ending the request, we had to compute the length of the whole form, asyncly - self.setHeaders(self._form.getHeaders()) - self._form.getLength(function (err, length) { - if (!err) { - self.setHeader('content-length', length) - } - end() - }) - } else { - end() - } - - self.ntick = true - }) - - } // End _buildRequest - - self._handleUnixSocketURI = function(self){ - // Parse URI and extract a socket path (tested as a valid socket using net.connect), and a http style path suffix - // Thus http requests can be made to a socket using the uri unix://tmp/my.socket/urlpath - // and a request for '/urlpath' will be sent to the unix socket at /tmp/my.socket - - self.unixsocket = true; - - var full_path = self.uri.href.replace(self.uri.protocol+'/', ''); - - var lookup = full_path.split('/'); - var error_connecting = true; - - var lookup_table = {}; - do { lookup_table[lookup.join('/')]={} } while(lookup.pop()) - for (r in lookup_table){ - try_next(r); - } - - function try_next(table_row){ - var client = net.connect( table_row ); - client.path = table_row - client.on('error', function(){ lookup_table[this.path].error_connecting=true; this.end(); }); - client.on('connect', function(){ lookup_table[this.path].error_connecting=false; this.end(); }); - table_row.client = client; - } - - wait_for_socket_response(); - - response_counter = 0; - - function wait_for_socket_response(){ - var detach; - if('undefined' == typeof setImmediate ) detach = process.nextTick - else detach = setImmediate; - detach(function(){ - // counter to prevent infinite blocking waiting for an open socket to be found. - response_counter++; - var trying = false; - for (r in lookup_table){ - //console.log(r, lookup_table[r], lookup_table[r].error_connecting) - if('undefined' == typeof lookup_table[r].error_connecting) - trying = true; - } - if(trying && response_counter<1000) - wait_for_socket_response() - else - set_socket_properties(); - }) - } - - function set_socket_properties(){ - var host; - for (r in lookup_table){ - if(lookup_table[r].error_connecting === false){ - host = r - } - } - if(!host){ - self.emit('error', new Error("Failed to connect to any socket in "+full_path)) - } - var path = full_path.replace(host, '') - - self.socketPath = host - self.uri.pathname = path - self.uri.href = path - self.uri.path = path - self.host = '' - self.hostname = '' - delete self.host - delete self.hostname - self._buildRequest(); - } - } - - // Intercept UNIX protocol requests to change properties to match socket - if(/^unix:/.test(self.uri.protocol)){ - self._handleUnixSocketURI(self); - } else { - self._buildRequest(); - } - -} - -// Must call this when following a redirect from https to http or vice versa -// Attempts to keep everything as identical as possible, but update the -// httpModule, Tunneling agent, and/or Forever Agent in use. -Request.prototype._updateProtocol = function () { - var self = this - var protocol = self.uri.protocol - - if (protocol === 'https:') { - // previously was doing http, now doing https - // if it's https, then we might need to tunnel now. - if (self.proxy && self.canTunnel) { - self.tunnel = true - var tunnelFn = self.proxy.protocol === 'http:' - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - var tunnelOptions = { proxy: { host: self.proxy.hostname - , port: +self.proxy.port - , proxyAuth: self.proxy.auth } - , rejectUnauthorized: self.rejectUnauthorized - , ca: self.ca } - self.agent = tunnelFn(tunnelOptions) - return - } - - self.httpModule = https - switch (self.agentClass) { - case ForeverAgent: - self.agentClass = ForeverAgent.SSL - break - case http.Agent: - self.agentClass = https.Agent - break - default: - // nothing we can do. Just hope for the best. - return - } - - // if there's an agent, we need to get a new one. - if (self.agent) self.agent = self.getAgent() - - } else { - // previously was doing https, now doing http - // stop any tunneling. - if (self.tunnel) self.tunnel = false - self.httpModule = http - switch (self.agentClass) { - case ForeverAgent.SSL: - self.agentClass = ForeverAgent - break - case https.Agent: - self.agentClass = http.Agent - break - default: - // nothing we can do. just hope for the best - return - } - - // if there's an agent, then get a new one. - if (self.agent) { - self.agent = null - self.agent = self.getAgent() - } - } -} - -Request.prototype.getAgent = function () { - var Agent = this.agentClass - var options = {} - if (this.agentOptions) { - for (var i in this.agentOptions) { - options[i] = this.agentOptions[i] - } - } - if (this.ca) options.ca = this.ca - if (this.ciphers) options.ciphers = this.ciphers - if (this.secureProtocol) options.secureProtocol = this.secureProtocol - if (this.secureOptions) options.secureOptions = this.secureOptions - if (typeof this.rejectUnauthorized !== 'undefined') options.rejectUnauthorized = this.rejectUnauthorized - - if (this.cert && this.key) { - options.key = this.key - options.cert = this.cert - } - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== this.httpModule.Agent) { - poolKey += Agent.name - } - - if (!this.httpModule.globalAgent) { - // node 0.4.x - options.host = this.host - options.port = this.port - if (poolKey) poolKey += ':' - poolKey += this.host + ':' + this.port - } - - // ca option is only relevant if proxy or destination are https - var proxy = this.proxy - if (typeof proxy === 'string') proxy = url.parse(proxy) - var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - if (isHttps) { - if (options.ca) { - if (poolKey) poolKey += ':' - poolKey += options.ca - } - - if (typeof options.rejectUnauthorized !== 'undefined') { - if (poolKey) poolKey += ':' - poolKey += options.rejectUnauthorized - } - - if (options.cert) - poolKey += options.cert.toString('ascii') + options.key.toString('ascii') - - if (options.ciphers) { - if (poolKey) poolKey += ':' - poolKey += options.ciphers - } - - if (options.secureProtocol) { - if (poolKey) poolKey += ':' - poolKey += options.secureProtocol - } - - if (options.secureOptions) { - if (poolKey) poolKey += ':' - poolKey += options.secureOptions - } - } - - if (this.pool === globalPool && !poolKey && Object.keys(options).length === 0 && this.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return this.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = this.uri.protocol + poolKey - - // already generated an agent for this setting - if (this.pool[poolKey]) return this.pool[poolKey] - - return this.pool[poolKey] = new Agent(options) -} - -Request.prototype.start = function () { - // start() is called once we are ready to send the outgoing HTTP request. - // this is usually called on the first write(), end() or on nextTick() - var self = this - - if (self._aborted) return - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - - if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { - self.setHeader('content-length', self.src.stat.size) - } - if (self._aws) { - self.aws(self._aws, true) - } - - // We have a method named auth, which is completely different from the http.request - // auth option. If we don't remove it, we're gonna have a bad time. - var reqOptions = copy(self) - delete reqOptions.auth - - debug('make request', self.uri.href) - self.req = self.httpModule.request(reqOptions, self.onResponse.bind(self)) - - if (self.timeout && !self.timeoutTimer) { - self.timeoutTimer = setTimeout(function () { - self.req.abort() - var e = new Error("ETIMEDOUT") - e.code = "ETIMEDOUT" - self.emit("error", e) - }, self.timeout) - - // Set additional timeout on socket - in case if remote - // server freeze after sending headers - if (self.req.setTimeout) { // only works on node 0.6+ - self.req.setTimeout(self.timeout, function () { - if (self.req) { - self.req.abort() - var e = new Error("ESOCKETTIMEDOUT") - e.code = "ESOCKETTIMEDOUT" - self.emit("error", e) - } - }) - } - } - - self.req.on('error', self.clientErrorHandler) - self.req.on('drain', function() { - self.emit('drain') - }) - self.on('end', function() { - if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler) - }) - self.emit('request', self.req) -} -Request.prototype.onResponse = function (response) { - var self = this - debug('onResponse', self.uri.href, response.statusCode, response.headers) - response.on('end', function() { - debug('response end', self.uri.href, response.statusCode, response.headers) - }); - - // The check on response.connection is a workaround for browserify. - if (response.connection && response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { - response.connection.setMaxListeners(0) - response.connection.once('error', self._parserErrorHandler) - } - if (self._aborted) { - debug('aborted', self.uri.href) - response.resume() - return - } - if (self._paused) response.pause() - // Check that response.resume is defined. Workaround for browserify. - else response.resume && response.resume() - - self.response = response - response.request = self - response.toJSON = toJSON - - // XXX This is different on 0.10, because SSL is strict by default - if (self.httpModule === https && - self.strictSSL && - !response.client.authorized) { - debug('strict ssl error', self.uri.href) - var sslErr = response.client.authorizationError - self.emit('error', new Error('SSL Error: '+ sslErr)) - return - } - - if (self.setHost && self.hasHeader('host')) delete self.headers[self.hasHeader('host')] - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var targetCookieJar = (self._jar && self._jar.setCookie)?self._jar:globalCookieJar; - var addCookie = function (cookie) { - //set the cookie if it's domain in the href's domain. - try { - targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}); - } catch (e) { - self.emit('error', e); - } - } - - if (hasHeader('set-cookie', response.headers) && (!self._disableCookies)) { - var headerName = hasHeader('set-cookie', response.headers) - if (Array.isArray(response.headers[headerName])) response.headers[headerName].forEach(addCookie) - else addCookie(response.headers[headerName]) - } - - var redirectTo = null - if (response.statusCode >= 300 && response.statusCode < 400 && hasHeader('location', response.headers)) { - var location = response.headers[hasHeader('location', response.headers)] - debug('redirect', location) - - if (self.followAllRedirects) { - redirectTo = location - } else if (self.followRedirect) { - switch (self.method) { - case 'PATCH': - case 'PUT': - case 'POST': - case 'DELETE': - // Do not follow redirects - break - default: - redirectTo = location - break - } - } - } else if (response.statusCode == 401 && self._hasAuth && !self._sentAuth) { - var authHeader = response.headers[hasHeader('www-authenticate', response.headers)] - var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase() - debug('reauth', authVerb) - - switch (authVerb) { - case 'basic': - self.auth(self._user, self._pass, true) - redirectTo = self.uri - break - - case 'bearer': - self.auth(null, null, true, self._bearer) - redirectTo = self.uri - break - - case 'digest': - // TODO: More complete implementation of RFC 2617. - // - check challenge.algorithm - // - support algorithm="MD5-sess" - // - handle challenge.domain - // - support qop="auth-int" only - // - handle Authentication-Info (not necessarily?) - // - check challenge.stale (not necessarily?) - // - increase nc (not necessarily?) - // For reference: - // http://tools.ietf.org/html/rfc2617#section-3 - // https://github.com/bagder/curl/blob/master/lib/http_digest.c - - var challenge = {} - var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi - for (;;) { - var match = re.exec(authHeader) - if (!match) break - challenge[match[1]] = match[2] || match[3]; - } - - var ha1 = md5(self._user + ':' + challenge.realm + ':' + self._pass) - var ha2 = md5(self.method + ':' + self.uri.path) - var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' - var nc = qop && '00000001' - var cnonce = qop && uuid().replace(/-/g, '') - var digestResponse = qop ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) : md5(ha1 + ':' + challenge.nonce + ':' + ha2) - var authValues = { - username: self._user, - realm: challenge.realm, - nonce: challenge.nonce, - uri: self.uri.path, - qop: qop, - response: digestResponse, - nc: nc, - cnonce: cnonce, - algorithm: challenge.algorithm, - opaque: challenge.opaque - } - - authHeader = [] - for (var k in authValues) { - if (!authValues[k]) { - //ignore - } else if (k === 'qop' || k === 'nc' || k === 'algorithm') { - authHeader.push(k + '=' + authValues[k]) - } else { - authHeader.push(k + '="' + authValues[k] + '"') - } - } - authHeader = 'Digest ' + authHeader.join(', ') - self.setHeader('authorization', authHeader) - self._sentAuth = true - - redirectTo = self.uri - break - } - } - - if (redirectTo) { - debug('redirect to', redirectTo) - - // ignore any potential response body. it cannot possibly be useful - // to us at this point. - if (self._paused) response.resume() - - if (self._redirectsFollowed >= self.maxRedirects) { - self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href)) - return - } - self._redirectsFollowed += 1 - - if (!isUrl.test(redirectTo)) { - redirectTo = url.resolve(self.uri.href, redirectTo) - } - - var uriPrev = self.uri - self.uri = url.parse(redirectTo) - - // handle the case where we change protocol from https to http or vice versa - if (self.uri.protocol !== uriPrev.protocol) { - self._updateProtocol() - } - - self.redirects.push( - { statusCode : response.statusCode - , redirectUri: redirectTo - } - ) - if (self.followAllRedirects && response.statusCode != 401 && response.statusCode != 307) self.method = 'GET' - // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 - delete self.src - delete self.req - delete self.agent - delete self._started - if (response.statusCode != 401 && response.statusCode != 307) { - // Remove parameters from the previous response, unless this is the second request - // for a server that requires digest authentication. - delete self.body - delete self._form - if (self.headers) { - if (self.hasHeader('host')) delete self.headers[self.hasHeader('host')] - if (self.hasHeader('content-type')) delete self.headers[self.hasHeader('content-type')] - if (self.hasHeader('content-length')) delete self.headers[self.hasHeader('content-length')] - } - } - - self.emit('redirect'); - - self.init() - return // Ignore the rest of the response - } else { - self._redirectsFollowed = self._redirectsFollowed || 0 - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) self.response.emit('end') - }) - - var dataStream - if (self.gzip) { - var contentEncoding = response.headers["content-encoding"] || "identity" - contentEncoding = contentEncoding.trim().toLowerCase() - - if (contentEncoding === "gzip") { - dataStream = zlib.createGunzip() - response.pipe(dataStream) - } else { - // Since previous versions didn't check for Content-Encoding header, - // ignore any invalid values to preserve backwards-compatibility - if (contentEncoding !== "identity") { - debug("ignoring unrecognized Content-Encoding " + contentEncoding) - } - dataStream = response - } - } else { - dataStream = response - } - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error("Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") - } else if (dataStream.setEncoding) { - dataStream.setEncoding(self.encoding) - } else { - // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with - // zlib streams. - // If/When support for 0.9.4 is dropped, this should be unnecessary. - dataStream = dataStream.pipe(stringstream(self.encoding)) - } - } - - self.emit('response', response) - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - dataStream.on("data", function (chunk) { - var emitted = self.emit("data", chunk) - if (emitted) { - self._destdata = true - } else { - // pause URL stream until we pipe it - dataStream.pause() - dataStream.unshift(chunk) - } - }) - dataStream.on("end", function (chunk) { - self._ended = true - self.emit("end", chunk) - }) - dataStream.on("close", function () {self.emit("close")}) - - if (self.callback) { - var buffer = [] - var bodyLen = 0 - self.on("data", function (chunk) { - buffer.push(chunk) - bodyLen += chunk.length - }) - self.on("end", function () { - debug('end event', self.uri.href) - if (self._aborted) { - debug('aborted', self.uri.href) - return - } - - if (buffer.length && Buffer.isBuffer(buffer[0])) { - debug('has body', self.uri.href, bodyLen) - var body = new Buffer(bodyLen) - var i = 0 - buffer.forEach(function (chunk) { - chunk.copy(body, i, 0, chunk.length) - i += chunk.length - }) - if (self.encoding === null) { - response.body = body - } else { - response.body = body.toString(self.encoding) - } - } else if (buffer.length) { - // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. - // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). - if (self.encoding === 'utf8' && buffer[0].length > 0 && buffer[0][0] === "\uFEFF") { - buffer[0] = buffer[0].substring(1) - } - response.body = buffer.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body) - } catch (e) {} - } - debug('emitting complete', self.uri.href) - if(response.body == undefined && !self._json) { - response.body = ""; - } - self.emit('complete', response, response.body) - }) - } - //if no callback - else{ - self.on("end", function () { - if (self._aborted) { - debug('aborted', self.uri.href) - return - } - self.emit('complete', response); - }); - } - } - debug('finish init function', self.uri.href) -} - -Request.prototype.abort = function () { - this._aborted = true - - if (this.req) { - this.req.abort() - } - else if (this.response) { - this.response.abort() - } - - this.emit("abort") -} - -Request.prototype.pipeDest = function (dest) { - var response = this.response - // Called after the response is received - if (dest.headers && !dest.headersSent) { - if (hasHeader('content-type', response.headers)) { - var ctname = hasHeader('content-type', response.headers) - if (dest.setHeader) dest.setHeader(ctname, response.headers[ctname]) - else dest.headers[ctname] = response.headers[ctname] - } - - if (hasHeader('content-length', response.headers)) { - var clname = hasHeader('content-length', response.headers) - if (dest.setHeader) dest.setHeader(clname, response.headers[clname]) - else dest.headers[clname] = response.headers[clname] - } - } - if (dest.setHeader && !dest.headersSent) { - for (var i in response.headers) { - // If the response content is being decoded, the Content-Encoding header - // of the response doesn't represent the piped content, so don't pass it. - if (!this.gzip || i !== 'content-encoding') { - dest.setHeader(i, response.headers[i]) - } - } - dest.statusCode = response.statusCode - } - if (this.pipefilter) this.pipefilter(response, dest) -} - -// Composable API -Request.prototype.setHeader = function (name, value, clobber) { - if (clobber === undefined) clobber = true - if (clobber || !this.hasHeader(name)) this.headers[name] = value - else this.headers[this.hasHeader(name)] += ',' + value - return this -} -Request.prototype.setHeaders = function (headers) { - for (var i in headers) {this.setHeader(i, headers[i])} - return this -} -Request.prototype.hasHeader = function (header, headers) { - var headers = Object.keys(headers || this.headers) - , lheaders = headers.map(function (h) {return h.toLowerCase()}) - ; - header = header.toLowerCase() - for (var i=0;i<lheaders.length;i++) { - if (lheaders[i] === header) return headers[i] - } - return false -} - -var hasHeader = Request.prototype.hasHeader - -Request.prototype.qs = function (q, clobber) { - var base - if (!clobber && this.uri.query) base = qs.parse(this.uri.query) - else base = {} - - for (var i in q) { - base[i] = q[i] - } - - if (qs.stringify(base) === ''){ - return this - } - - this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base)) - this.url = this.uri - this.path = this.uri.path - - return this -} -Request.prototype.form = function (form) { - if (form) { - this.setHeader('content-type', 'application/x-www-form-urlencoded; charset=utf-8') - this.body = (typeof form === 'string') ? form.toString('utf8') : qs.stringify(form).toString('utf8') - return this - } - // create form-data object - this._form = new FormData() - return this._form -} -Request.prototype.multipart = function (multipart) { - var self = this - self.body = [] - - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) - } else { - var headerName = self.hasHeader('content-type'); - self.setHeader(headerName, self.headers[headerName].split(';')[0] + '; boundary=' + self.boundary) - } - - if (!multipart.forEach) throw new Error('Argument error, options.multipart.') - - if (self.preambleCRLF) { - self.body.push(new Buffer('\r\n')) - } - - multipart.forEach(function (part) { - var body = part.body - if(body == null) throw Error('Body attribute missing in multipart.') - delete part.body - var preamble = '--' + self.boundary + '\r\n' - Object.keys(part).forEach(function (key) { - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n' - self.body.push(new Buffer(preamble)) - self.body.push(new Buffer(body)) - self.body.push(new Buffer('\r\n')) - }) - self.body.push(new Buffer('--' + self.boundary + '--')) - return self -} -Request.prototype.json = function (val) { - var self = this - - if (!self.hasHeader('accept')) self.setHeader('accept', 'application/json') - - this._json = true - if (typeof val === 'boolean') { - if (typeof this.body === 'object') { - this.body = safeStringify(this.body) - if (!self.hasHeader('content-type')) - self.setHeader('content-type', 'application/json') - } - } else { - this.body = safeStringify(val) - if (!self.hasHeader('content-type')) - self.setHeader('content-type', 'application/json') - } - - return this -} -Request.prototype.getHeader = function (name, headers) { - var result, re, match - if (!headers) headers = this.headers - Object.keys(headers).forEach(function (key) { - if (key.length !== name.length) return - re = new RegExp(name, 'i') - match = key.match(re) - if (match) result = headers[key] - }) - return result -} -var getHeader = Request.prototype.getHeader - -Request.prototype.auth = function (user, pass, sendImmediately, bearer) { - if (bearer !== undefined) { - this._bearer = bearer - this._hasAuth = true - if (sendImmediately || typeof sendImmediately == 'undefined') { - if (typeof bearer === 'function') { - bearer = bearer() - } - this.setHeader('authorization', 'Bearer ' + bearer) - this._sentAuth = true - } - return this - } - if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { - throw new Error('auth() received invalid user or password') - } - this._user = user - this._pass = pass - this._hasAuth = true - var header = typeof pass !== 'undefined' ? user + ':' + pass : user - if (sendImmediately || typeof sendImmediately == 'undefined') { - this.setHeader('authorization', 'Basic ' + toBase64(header)) - this._sentAuth = true - } - return this -} -Request.prototype.aws = function (opts, now) { - if (!now) { - this._aws = opts - return this - } - var date = new Date() - this.setHeader('date', date.toUTCString()) - var auth = - { key: opts.key - , secret: opts.secret - , verb: this.method.toUpperCase() - , date: date - , contentType: this.getHeader('content-type') || '' - , md5: this.getHeader('content-md5') || '' - , amazonHeaders: aws.canonicalizeHeaders(this.headers) - } - if (opts.bucket && this.path) { - auth.resource = '/' + opts.bucket + this.path - } else if (opts.bucket && !this.path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && this.path) { - auth.resource = this.path - } else if (!opts.bucket && !this.path) { - auth.resource = '/' - } - auth.resource = aws.canonicalizeResource(auth.resource) - this.setHeader('authorization', aws.authorization(auth)) - - return this -} -Request.prototype.httpSignature = function (opts) { - var req = this - httpSignature.signRequest({ - getHeader: function(header) { - return getHeader(header, req.headers) - }, - setHeader: function(header, value) { - req.setHeader(header, value) - }, - method: this.method, - path: this.path - }, opts) - debug('httpSignature authorization', this.getHeader('authorization')) - - return this -} - -Request.prototype.hawk = function (opts) { - this.setHeader('Authorization', hawk.client.header(this.uri, this.method, opts).field) -} - -Request.prototype.oauth = function (_oauth) { - var form - if (this.hasHeader('content-type') && - this.getHeader('content-type').slice(0, 'application/x-www-form-urlencoded'.length) === - 'application/x-www-form-urlencoded' - ) { - form = qs.parse(this.body) - } - if (this.uri.query) { - form = qs.parse(this.uri.query) - } - if (!form) form = {} - var oa = {} - for (var i in form) oa[i] = form[i] - for (var i in _oauth) oa['oauth_'+i] = _oauth[i] - if (!oa.oauth_version) oa.oauth_version = '1.0' - if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( Date.now() / 1000 ).toString() - if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') - - oa.oauth_signature_method = 'HMAC-SHA1' - - var consumer_secret = oa.oauth_consumer_secret - delete oa.oauth_consumer_secret - var token_secret = oa.oauth_token_secret - delete oa.oauth_token_secret - var timestamp = oa.oauth_timestamp - - var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname - var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret) - - // oa.oauth_signature = signature - for (var i in form) { - if ( i.slice(0, 'oauth_') in _oauth) { - // skip - } else { - delete oa['oauth_'+i] - if (i !== 'x_auth_mode') delete oa[i] - } - } - oa.oauth_timestamp = timestamp - var authHeader = 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') - authHeader += ',oauth_signature="' + oauth.rfc3986(signature) + '"' - this.setHeader('Authorization', authHeader) - return this -} -Request.prototype.jar = function (jar) { - var cookies - - if (this._redirectsFollowed === 0) { - this.originalCookieHeader = this.getHeader('cookie') - } - - if (!jar) { - // disable cookies - cookies = false - this._disableCookies = true - } else { - var targetCookieJar = (jar && jar.getCookieString)?jar:globalCookieJar; - var urihref = this.uri.href - //fetch cookie in the Specified host - if (targetCookieJar) { - cookies = targetCookieJar.getCookieString(urihref); - } - } - - //if need cookie and cookie is not empty - if (cookies && cookies.length) { - if (this.originalCookieHeader) { - // Don't overwrite existing Cookie header - this.setHeader('cookie', this.originalCookieHeader + '; ' + cookies) - } else { - this.setHeader('cookie', cookies) - } - } - this._jar = jar - return this -} - - -// Stream API -Request.prototype.pipe = function (dest, opts) { - if (this.response) { - if (this._destdata) { - throw new Error("You cannot pipe after data has been emitted from the response.") - } else if (this._ended) { - throw new Error("You cannot pipe after the response has been ended.") - } else { - stream.Stream.prototype.pipe.call(this, dest, opts) - this.pipeDest(dest) - return dest - } - } else { - this.dests.push(dest) - stream.Stream.prototype.pipe.call(this, dest, opts) - return dest - } -} -Request.prototype.write = function () { - if (!this._started) this.start() - return this.req.write.apply(this.req, arguments) -} -Request.prototype.end = function (chunk) { - if (chunk) this.write(chunk) - if (!this._started) this.start() - this.req.end() -} -Request.prototype.pause = function () { - if (!this.response) this._paused = true - else this.response.pause.apply(this.response, arguments) -} -Request.prototype.resume = function () { - if (!this.response) this._paused = false - else this.response.resume.apply(this.response, arguments) -} -Request.prototype.destroy = function () { - if (!this._ended) this.end() - else if (this.response) this.response.destroy() -} - -function toJSON () { - return getSafe(this, '__' + (((1+Math.random())*0x10000)|0).toString(16)) -} - -Request.prototype.toJSON = toJSON - -/* Fix per https://github.com/mikeal/request/issues/887#issuecomment-48831952 */ -var superOn = Request.prototype.on; -Request.prototype.on = function (eventName) { - if (eventName === "data") { - this.resume() - } - superOn.apply(this, arguments) -} - -module.exports = Request diff --git a/packages/wekan-request/tests/googledoodle.jpg b/packages/wekan-request/tests/googledoodle.jpg deleted file mode 100644 index f80c9c52d..000000000 Binary files a/packages/wekan-request/tests/googledoodle.jpg and /dev/null differ diff --git a/packages/wekan-request/tests/run.js b/packages/wekan-request/tests/run.js deleted file mode 100644 index 34da0a1e7..000000000 --- a/packages/wekan-request/tests/run.js +++ /dev/null @@ -1,46 +0,0 @@ -var spawn = require('child_process').spawn - , exitCode = 0 - , timeout = 10000 - , fs = require('fs') - ; - -// clear proxy releated environment variables -delete process.env.HTTP_PROXY -delete process.env.http_proxy -delete process.env.HTTPS_PROXY -delete process.env.https_proxy - -fs.readdir(__dirname, function (e, files) { - if (e) throw e - - var tests = files.filter(function (f) {return f.slice(0, 'test-'.length) === 'test-'}) - - var next = function () { - if (tests.length === 0) process.exit(exitCode); - - var file = tests.shift() - console.log(file) - var proc = spawn('node', [ 'tests/' + file ]) - - var killed = false - var t = setTimeout(function () { - proc.kill() - exitCode += 1 - console.error(file + ' timeout') - killed = true - }, timeout) - - proc.stdout.pipe(process.stdout) - proc.stderr.pipe(process.stderr) - proc.on('exit', function (code) { - if (code && !killed) console.error(file + ' failed') - exitCode += code || 0 - clearTimeout(t) - next() - }) - } - next() - -}) - - diff --git a/packages/wekan-request/tests/server.js b/packages/wekan-request/tests/server.js deleted file mode 100644 index b6eacbadc..000000000 --- a/packages/wekan-request/tests/server.js +++ /dev/null @@ -1,90 +0,0 @@ -var fs = require('fs') - , http = require('http') - , path = require('path') - , https = require('https') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createSSLServer = function(port, opts) { - port = port || 16767 - - var options = { 'key' : path.join(__dirname, 'ssl', 'test.key') - , 'cert': path.join(__dirname, 'ssl', 'test.crt') - } - if (opts) { - for (var i in opts) options[i] = opts[i] - } - - for (var i in options) { - options[i] = fs.readFileSync(options[i]) - } - - var s = https.createServer(options, function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'https://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text, reqContentType) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (req.headers['content-type'] && req.headers['content-type'].indexOf('boundary=') >= 0) { - var boundary = req.headers['content-type'].split('boundary=')[1]; - text = text.replace(/__BOUNDARY__/g, boundary); - } - if (r !== text) console.log(r, text); - assert.equal(r, text) - if (reqContentType) { - assert.ok(req.headers['content-type']) - assert.ok(~req.headers['content-type'].indexOf(reqContentType)) - } - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/packages/wekan-request/tests/squid.conf b/packages/wekan-request/tests/squid.conf deleted file mode 100644 index 0d4a3b6fe..000000000 --- a/packages/wekan-request/tests/squid.conf +++ /dev/null @@ -1,77 +0,0 @@ -# -# Recommended minimum configuration: -# -acl manager proto cache_object -acl localhost src 127.0.0.1/32 ::1 -acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 - -# Example rule allowing access from your local networks. -# Adapt to list your (internal) IP networks from where browsing -# should be allowed -acl localnet src 10.0.0.0/8 # RFC1918 possible internal network -acl localnet src 172.16.0.0/12 # RFC1918 possible internal network -acl localnet src 192.168.0.0/16 # RFC1918 possible internal network -acl localnet src fc00::/7 # RFC 4193 local private network range -acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines - -acl SSL_ports port 443 -acl Safe_ports port 80 # http -acl Safe_ports port 21 # ftp -acl Safe_ports port 443 # https -acl Safe_ports port 70 # gopher -acl Safe_ports port 210 # wais -acl Safe_ports port 1025-65535 # unregistered ports -acl Safe_ports port 280 # http-mgmt -acl Safe_ports port 488 # gss-http -acl Safe_ports port 591 # filemaker -acl Safe_ports port 777 # multiling http -acl CONNECT method CONNECT - -# -# Recommended minimum Access Permission configuration: -# -# Only allow cachemgr access from localhost -http_access allow manager localhost -http_access deny manager - -# Deny requests to certain unsafe ports -http_access deny !Safe_ports - -# Deny CONNECT to other than secure SSL ports -#http_access deny CONNECT !SSL_ports - -# We strongly recommend the following be uncommented to protect innocent -# web applications running on the proxy server who think the only -# one who can access services on "localhost" is a local user -#http_access deny to_localhost - -# -# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS -# - -# Example rule allowing access from your local networks. -# Adapt localnet in the ACL section to list your (internal) IP networks -# from where browsing should be allowed -http_access allow localnet -http_access allow localhost - -# And finally deny all other access to this proxy -http_access deny all - -# Squid normally listens to port 3128 -http_port 3128 - -# We recommend you to use at least the following line. -hierarchy_stoplist cgi-bin ? - -# Uncomment and adjust the following to add a disk cache directory. -#cache_dir ufs /usr/local/var/cache 100 16 256 - -# Leave coredumps in the first cache dir -coredump_dir /usr/local/var/cache - -# Add any of your own refresh_pattern entries above these. -refresh_pattern ^ftp: 1440 20% 10080 -refresh_pattern ^gopher: 1440 0% 1440 -refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 -refresh_pattern . 0 20% 4320 diff --git a/packages/wekan-request/tests/ssl/ca/ca.cnf b/packages/wekan-request/tests/ssl/ca/ca.cnf deleted file mode 100644 index 425a88915..000000000 --- a/packages/wekan-request/tests/ssl/ca/ca.cnf +++ /dev/null @@ -1,20 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no -output_password = password - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = request Certificate Authority -CN = requestCA -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/packages/wekan-request/tests/ssl/ca/ca.crl b/packages/wekan-request/tests/ssl/ca/ca.crl deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/wekan-request/tests/ssl/ca/ca.crt b/packages/wekan-request/tests/ssl/ca/ca.crt deleted file mode 100644 index b4524e44b..000000000 --- a/packages/wekan-request/tests/ssl/ca/ca.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICvTCCAiYCCQDn+P/MSbDsWjANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGiMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxJjAkBgNVBAsTHXJlcXVlc3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MRIwEAYDVQQDEwlyZXF1ZXN0Q0ExJjAkBgkqhkiG9w0BCQEWF21pa2VhbEBtaWtl -YWxyb2dlcnMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7t9pQUAK4 -5XJYTI6NrF0n3G2HZsfN+rPYSVzzL8SuVyb1tHXos+vbPm3NKI4E8X1yVAXU8CjJ -5SqXnp4DAypAhaseho81cbhk7LXUhFz78OvAa+OD+xTAEAnNQ8tGUr4VGyplEjfD -xsBVuqV2j8GPNTftr+drOCFlqfAgMrBn4wIDAQABMA0GCSqGSIb3DQEBBQUAA4GB -ADVdTlVAL45R+PACNS7Gs4o81CwSclukBu4FJbxrkd4xGQmurgfRrYYKjtqiopQm -D7ysRamS3HMN9/VKq2T7r3z1PMHPAy7zM4uoXbbaTKwlnX4j/8pGPn8Ca3qHXYlo -88L/OOPc6Di7i7qckS3HFbXQCTiULtxWmy97oEuTwrAj ------END CERTIFICATE----- diff --git a/packages/wekan-request/tests/ssl/ca/ca.csr b/packages/wekan-request/tests/ssl/ca/ca.csr deleted file mode 100644 index e48c56eef..000000000 --- a/packages/wekan-request/tests/ssl/ca/ca.csr +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICBjCCAW8CAQAwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEmMCQGA1UECxMdcmVxdWVzdCBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEjAQBgNVBAMTCXJlcXVlc3RDQTEmMCQGCSqG -SIb3DQEJARYXbWlrZWFsQG1pa2VhbHJvZ2Vycy5jb20wgZ8wDQYJKoZIhvcNAQEB -BQADgY0AMIGJAoGBALu32lBQArjlclhMjo2sXSfcbYdmx836s9hJXPMvxK5XJvW0 -deiz69s+bc0ojgTxfXJUBdTwKMnlKpeengMDKkCFqx6GjzVxuGTstdSEXPvw68Br -44P7FMAQCc1Dy0ZSvhUbKmUSN8PGwFW6pXaPwY81N+2v52s4IWWp8CAysGfjAgMB -AAGgIzAhBgkqhkiG9w0BCQcxFBMScGFzc3dvcmQgY2hhbGxlbmdlMA0GCSqGSIb3 -DQEBBQUAA4GBAGJO7grHeVHXetjHEK8urIxdnvfB2qeZeObz4GPKIkqUurjr0rfj -bA3EK1kDMR5aeQWR8RunixdM16Q6Ry0lEdLVWkdSwRN9dmirIHT9cypqnD/FYOia -SdezZ0lUzXgmJIwRYRwB1KSMMocIf52ll/xC2bEGg7/ZAEuAyAgcZV3X ------END CERTIFICATE REQUEST----- diff --git a/packages/wekan-request/tests/ssl/ca/ca.key b/packages/wekan-request/tests/ssl/ca/ca.key deleted file mode 100644 index a53e7f75d..000000000 --- a/packages/wekan-request/tests/ssl/ca/ca.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,C8B5887048377F02 - -nyD5ZH0Wup2uWsDvurq5mKDaDrf8lvNn9w0SH/ZkVnfR1/bkwqrFriqJWvZNUG+q -nS0iBYczsWLJnbub9a1zLOTENWUKVD5uqbC3aGHhnoUTNSa27DONgP8gHOn6JgR+ -GAKo01HCSTiVT4LjkwN337QKHnMP2fTzg+IoC/CigvMcq09hRLwU1/guq0GJKGwH -gTxYNuYmQC4Tjh8vdS4liF+Ve/P3qPR2CehZrIOkDT8PHJBGQJRo4xGUIB7Tpk38 -VCk+UZ0JCS2coY8VkY/9tqFJp/ZnnQQVmaNbdRqg7ECKL+bXnNo7yjzmazPZmPe3 -/ShbE0+CTt7LrjCaQAxWbeDzqfo1lQfgN1LulTm8MCXpQaJpv7v1VhIhQ7afjMYb -4thW/ypHPiYS2YJCAkAVlua9Oxzzh1qJoh8Df19iHtpd79Q77X/qf+1JvITlMu0U -gi7yEatmQcmYNws1mtTC1q2DXrO90c+NZ0LK/Alse6NRL/xiUdjug2iHeTf/idOR -Gg/5dSZbnnlj1E5zjSMDkzg6EHAFmHV4jYGSAFLEQgp4V3ZhMVoWZrvvSHgKV/Qh -FqrAK4INr1G2+/QTd09AIRzfy3/j6yD4A9iNaOsEf9Ua7Qh6RcALRCAZTWR5QtEf -dX+iSNJ4E85qXs0PqwkMDkoaxIJ+tmIRJY7y8oeylV8cfGAi8Soubt/i3SlR8IHC -uDMas/2OnwafK3N7ODeE1i7r7wkzQkSHaEz0TrF8XRnP25jAICCSLiMdAAjKfxVb -EvzsFSuAy3Jt6bU3hSLY9o4YVYKE+68ITMv9yNjvTsEiW+T+IbN34w== ------END RSA PRIVATE KEY----- diff --git a/packages/wekan-request/tests/ssl/ca/ca.srl b/packages/wekan-request/tests/ssl/ca/ca.srl deleted file mode 100644 index 17128db3a..000000000 --- a/packages/wekan-request/tests/ssl/ca/ca.srl +++ /dev/null @@ -1 +0,0 @@ -ADF62016AA40C9C3 diff --git a/packages/wekan-request/tests/ssl/ca/server.cnf b/packages/wekan-request/tests/ssl/ca/server.cnf deleted file mode 100644 index cd1fd1e39..000000000 --- a/packages/wekan-request/tests/ssl/ca/server.cnf +++ /dev/null @@ -1,19 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = testing -CN = testing.request.mikealrogers.com -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/packages/wekan-request/tests/ssl/ca/server.crt b/packages/wekan-request/tests/ssl/ca/server.crt deleted file mode 100644 index efe96cefc..000000000 --- a/packages/wekan-request/tests/ssl/ca/server.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICejCCAeMCCQCt9iAWqkDJwzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGjMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxEDAOBgNVBAsTB3Rlc3RpbmcxKTAnBgNVBAMTIHRlc3RpbmcucmVx -dWVzdC5taWtlYWxyb2dlcnMuY29tMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlr -ZWFscm9nZXJzLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDgVl0jMumvOpmM -20W5v9yhGgZj8hPhEQF/N7yCBVBn/rWGYm70IHC8T/pR5c0LkWc5gdnCJEvKWQjh -DBKxZD8FAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEABShRkNgFbgs4vUWW9R9deNJj -7HJoiTmvkmoOC7QzcYkjdgHbOxsSq3rBnwxsVjY9PAtPwBn0GRspOeG7KzKRgySB -kb22LyrCFKbEOfKO/+CJc80ioK9zEPVjGsFMyAB+ftYRqM+s/4cQlTg/m89l01wC -yapjN3RxZbInGhWR+jA= ------END CERTIFICATE----- diff --git a/packages/wekan-request/tests/ssl/ca/server.csr b/packages/wekan-request/tests/ssl/ca/server.csr deleted file mode 100644 index a8e7595a5..000000000 --- a/packages/wekan-request/tests/ssl/ca/server.csr +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBgjCCASwCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEQMA4GA1UECxMHdGVzdGluZzEp -MCcGA1UEAxMgdGVzdGluZy5yZXF1ZXN0Lm1pa2VhbHJvZ2Vycy5jb20xJjAkBgkq -hkiG9w0BCQEWF21pa2VhbEBtaWtlYWxyb2dlcnMuY29tMFwwDQYJKoZIhvcNAQEB -BQADSwAwSAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAaAjMCEGCSqGSIb3DQEJBzEU -ExJwYXNzd29yZCBjaGFsbGVuZ2UwDQYJKoZIhvcNAQEFBQADQQBD3E5WekQzCEJw -7yOcqvtPYIxGaX8gRKkYfLPoj3pm3GF5SGqtJKhylKfi89szHXgktnQgzff9FN+A -HidVJ/3u ------END CERTIFICATE REQUEST----- diff --git a/packages/wekan-request/tests/ssl/ca/server.js b/packages/wekan-request/tests/ssl/ca/server.js deleted file mode 100644 index 05e21c116..000000000 --- a/packages/wekan-request/tests/ssl/ca/server.js +++ /dev/null @@ -1,28 +0,0 @@ -var fs = require("fs") -var https = require("https") -var options = { key: fs.readFileSync("./server.key") - , cert: fs.readFileSync("./server.crt") } - -var server = https.createServer(options, function (req, res) { - res.writeHead(200) - res.end() - server.close() -}) -server.listen(1337) - -var ca = fs.readFileSync("./ca.crt") -var agent = new https.Agent({ host: "localhost", port: 1337, ca: ca }) - -https.request({ host: "localhost" - , method: "HEAD" - , port: 1337 - , headers: { host: "testing.request.mikealrogers.com" } - , agent: agent - , ca: [ ca ] - , path: "/" }, function (res) { - if (res.client.authorized) { - console.log("node test: OK") - } else { - throw new Error(res.client.authorizationError) - } -}).end() diff --git a/packages/wekan-request/tests/ssl/ca/server.key b/packages/wekan-request/tests/ssl/ca/server.key deleted file mode 100644 index 72d86984f..000000000 --- a/packages/wekan-request/tests/ssl/ca/server.key +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBOwIBAAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAQJAK+r8ZM2sze8s7FRo/ApB -iRBtO9fCaIdJwbwJnXKo4RKwZDt1l2mm+fzZ+/QaQNjY1oTROkIIXmnwRvZWfYlW -gQIhAPKYsG+YSBN9o8Sdp1DMyZ/rUifKX3OE6q9tINkgajDVAiEA7Ltqh01+cnt0 -JEnud/8HHcuehUBLMofeg0G+gCnSbXECIQCqDvkXsWNNLnS/3lgsnvH0Baz4sbeJ -rjIpuVEeg8eM5QIgbu0+9JmOV6ybdmmiMV4yAncoF35R/iKGVHDZCAsQzDECIQDZ -0jGz22tlo5YMcYSqrdD3U4sds1pwiAaWFRbCunoUJw== ------END RSA PRIVATE KEY----- diff --git a/packages/wekan-request/tests/ssl/npm-ca.crt b/packages/wekan-request/tests/ssl/npm-ca.crt deleted file mode 100644 index fde2fe933..000000000 --- a/packages/wekan-request/tests/ssl/npm-ca.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x -IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w -bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y -MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV -BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj -YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA -aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE -OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz -Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl -y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC -l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv -yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl -ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op ------END CERTIFICATE----- diff --git a/packages/wekan-request/tests/ssl/test.crt b/packages/wekan-request/tests/ssl/test.crt deleted file mode 100644 index b357f8641..000000000 --- a/packages/wekan-request/tests/ssl/test.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICQzCCAawCCQCO/XWtRFck1jANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJU -SDEQMA4GA1UECBMHQmFuZ2tvazEOMAwGA1UEBxMFU2lsb20xGzAZBgNVBAoTElRo -ZSBSZXF1ZXN0IE1vZHVsZTEYMBYGA1UEAxMPcmVxdWVzdC5leGFtcGxlMB4XDTEx -MTIwMzAyMjkyM1oXDTIxMTEzMDAyMjkyM1owZjELMAkGA1UEBhMCVEgxEDAOBgNV -BAgTB0Jhbmdrb2sxDjAMBgNVBAcTBVNpbG9tMRswGQYDVQQKExJUaGUgUmVxdWVz -dCBNb2R1bGUxGDAWBgNVBAMTD3JlcXVlc3QuZXhhbXBsZTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwmctddZqlA48+NXs0yOy92DijcQV1jf87zMiYAIlNUto -wghVbTWgJU5r0pdKrD16AptnWJTzKanhItEX8XCCPgsNkq1afgTtJP7rNkwu3xcj -eIMkhJg/ay4ZnkbnhYdsii5VTU5prix6AqWRAhbkBgoA+iVyHyof8wvZyKBoFTMC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQB6BybMJbpeiABgihDfEVBcAjDoQ8gUMgwV -l4NulugfKTDmArqnR9aPd4ET5jX5dkMP4bwCHYsvrcYDeWEQy7x5WWuylOdKhua4 -L4cEi2uDCjqEErIG3cc1MCOk6Cl6Ld6tkIzQSf953qfdEACRytOeUqLNQcrXrqeE -c7U8F6MWLQ== ------END CERTIFICATE----- diff --git a/packages/wekan-request/tests/ssl/test.key b/packages/wekan-request/tests/ssl/test.key deleted file mode 100644 index b85810dda..000000000 --- a/packages/wekan-request/tests/ssl/test.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDCZy111mqUDjz41ezTI7L3YOKNxBXWN/zvMyJgAiU1S2jCCFVt -NaAlTmvSl0qsPXoCm2dYlPMpqeEi0RfxcII+Cw2SrVp+BO0k/us2TC7fFyN4gySE -mD9rLhmeRueFh2yKLlVNTmmuLHoCpZECFuQGCgD6JXIfKh/zC9nIoGgVMwIDAQAB -AoGBALXFwfUf8vHTSmGlrdZS2AGFPvEtuvldyoxi9K5u8xmdFCvxnOcLsF2RsTHt -Mu5QYWhUpNJoG+IGLTPf7RJdj/kNtEs7xXqWy4jR36kt5z5MJzqiK+QIgiO9UFWZ -fjUb6oeDnTIJA9YFBdYi97MDuL89iU/UK3LkJN3hd4rciSbpAkEA+MCkowF5kSFb -rkOTBYBXZfiAG78itDXN6DXmqb9XYY+YBh3BiQM28oxCeQYyFy6pk/nstnd4TXk6 -V/ryA2g5NwJBAMgRKTY9KvxJWbESeMEFe2iBIV0c26/72Amgi7ZKUCLukLfD4tLF -+WSZdmTbbqI1079YtwaiOVfiLm45Q/3B0eUCQAaQ/0eWSGE+Yi8tdXoVszjr4GXb -G81qBi91DMu6U1It+jNfIba+MPsiHLcZJMVb4/oWBNukN7bD1nhwFWdlnu0CQQCf -Is9WHkdvz2RxbZDxb8verz/7kXXJQJhx5+rZf7jIYFxqX3yvTNv3wf2jcctJaWlZ -fVZwB193YSivcgt778xlAkEAprYUz3jczjF5r2hrgbizPzPDR94tM5BTO3ki2v3w -kbf+j2g7FNAx6kZiVN8XwfLc8xEeUGiPKwtq3ddPDFh17w== ------END RSA PRIVATE KEY----- diff --git a/packages/wekan-request/tests/test-agentOptions.js b/packages/wekan-request/tests/test-agentOptions.js deleted file mode 100644 index 47fe3aaed..000000000 --- a/packages/wekan-request/tests/test-agentOptions.js +++ /dev/null @@ -1,23 +0,0 @@ -var request = require('../index') - , http = require('http') - , server = require('./server') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('') -}).listen(6767, function () { - // requests without agentOptions should use global agent - var r = request('http://localhost:6767', function (e, resp, body) { - assert.deepEqual(r.agent, http.globalAgent); - assert.equal(Object.keys(r.pool).length, 0); - - // requests with agentOptions should apply agentOptions to new agent in pool - var r2 = request('http://localhost:6767', { agentOptions: { foo: 'bar' } }, function (e, resp, body) { - assert.deepEqual(r2.agent.options, { foo: 'bar' }); - assert.equal(Object.keys(r2.pool).length, 1); - s.close() - }); - }) -}) diff --git a/packages/wekan-request/tests/test-basic-auth.js b/packages/wekan-request/tests/test-basic-auth.js deleted file mode 100644 index 23f4ee28c..000000000 --- a/packages/wekan-request/tests/test-basic-auth.js +++ /dev/null @@ -1,191 +0,0 @@ -var assert = require('assert') - , http = require('http') - , request = require('../index') - ; - -var numBasicRequests = 0; - -var basicServer = http.createServer(function (req, res) { - console.error('Basic auth server: ', req.method, req.url); - numBasicRequests++; - - var ok; - - if (req.headers.authorization) { - if (req.headers.authorization == 'Basic ' + new Buffer('test:testing2').toString('base64')) { - ok = true; - } else if ( req.headers.authorization == 'Basic ' + new Buffer('test:').toString('base64')) { - ok = true; - } else if ( req.headers.authorization == 'Basic ' + new Buffer(':apassword').toString('base64')) { - ok = true; - } else if ( req.headers.authorization == 'Basic ' + new Buffer('justauser').toString('base64')) { - ok = true; - } else { - // Bad auth header, don't send back WWW-Authenticate header - ok = false; - } - } else { - // No auth header, send back WWW-Authenticate header - ok = false; - res.setHeader('www-authenticate', 'Basic realm="Private"'); - } - - if (req.url == '/post/') { - var expectedContent = 'data_key=data_value'; - req.on('data', function(data) { - assert.equal(data, expectedContent); - console.log('received request data: ' + data); - }); - assert.equal(req.method, 'POST'); - assert.equal(req.headers['content-length'], '' + expectedContent.length); - assert.equal(req.headers['content-type'], 'application/x-www-form-urlencoded; charset=utf-8'); - } - - if (ok) { - console.log('request ok'); - res.end('ok'); - } else { - console.log('status=401'); - res.statusCode = 401; - res.end('401'); - } -}); - -basicServer.listen(6767); - -var tests = [ - function(next) { - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test/', - 'auth': { - 'user': 'test', - 'pass': 'testing2', - 'sendImmediately': false - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 2); - next(); - }); - }, - - function(next) { - // If we don't set sendImmediately = false, request will send basic auth - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test2/', - 'auth': { - 'user': 'test', - 'pass': 'testing2' - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 3); - next(); - }); - }, - - function(next) { - request({ - 'method': 'GET', - 'uri': 'http://test:testing2@localhost:6767/test2/' - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 4); - next(); - }); - }, - - function(next) { - request({ - 'method': 'POST', - 'form': { 'data_key': 'data_value' }, - 'uri': 'http://localhost:6767/post/', - 'auth': { - 'user': 'test', - 'pass': 'testing2', - 'sendImmediately': false - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 6); - next(); - }); - }, - - function(next) { - assert.doesNotThrow( function() { - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/allow_empty_user/', - 'auth': { - 'user': '', - 'pass': 'apassword', - 'sendImmediately': false - } - }, function(error, res, body ) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 8); - next(); - }); - }) - }, - - function(next) { - assert.doesNotThrow( function() { - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/allow_undefined_password/', - 'auth': { - 'user': 'justauser', - 'pass': undefined, - 'sendImmediately': false - } - }, function(error, res, body ) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 10); - next(); - }); - }) - }, - - function (next) { - request - .get('http://localhost:6767/test/') - .auth("test","",false) - .on('response', function (res) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 12); - next(); - }) - }, - - function (next) { - request.get('http://localhost:6767/test/', - { - auth: { - user: "test", - pass: "", - sendImmediately: false - } - }, function (err, res) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 14); - next(); - }) - } -]; - -function runTest(i) { - if (i < tests.length) { - tests[i](function() { - runTest(i + 1); - }); - } else { - console.log('All tests passed'); - basicServer.close(); - } -} - -runTest(0); diff --git a/packages/wekan-request/tests/test-bearer-auth.js b/packages/wekan-request/tests/test-bearer-auth.js deleted file mode 100644 index 3f306c671..000000000 --- a/packages/wekan-request/tests/test-bearer-auth.js +++ /dev/null @@ -1,161 +0,0 @@ -var assert = require('assert') - , http = require('http') - , request = require('../index') - ; - -var numBasicRequests = 0; - -var basicServer = http.createServer(function (req, res) { - console.error('Bearer auth server: ', req.method, req.url); - numBasicRequests++; - - var ok; - - if (req.headers.authorization) { - if (req.headers.authorization == 'Bearer theToken') { - ok = true; - } else { - // Bad auth header, don't send back WWW-Authenticate header - ok = false; - } - } else { - // No auth header, send back WWW-Authenticate header - ok = false; - res.setHeader('www-authenticate', 'Bearer realm="Private"'); - } - - if (req.url == '/post/') { - var expectedContent = 'data_key=data_value'; - req.on('data', function(data) { - assert.equal(data, expectedContent); - console.log('received request data: ' + data); - }); - assert.equal(req.method, 'POST'); - assert.equal(req.headers['content-length'], '' + expectedContent.length); - assert.equal(req.headers['content-type'], 'application/x-www-form-urlencoded; charset=utf-8'); - } - - if (ok) { - console.log('request ok'); - res.end('ok'); - } else { - console.log('status=401'); - res.statusCode = 401; - res.end('401'); - } -}); - -basicServer.listen(6767); - -var tests = [ - function(next) { - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test/', - 'auth': { - 'bearer': 'theToken', - 'sendImmediately': false - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 2); - next(); - }); - }, - - function(next) { - // If we don't set sendImmediately = false, request will send bearer auth - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test2/', - 'auth': { - 'bearer': 'theToken' - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 3); - next(); - }); - }, - - function(next) { - request({ - 'method': 'POST', - 'form': { 'data_key': 'data_value' }, - 'uri': 'http://localhost:6767/post/', - 'auth': { - 'bearer': 'theToken', - 'sendImmediately': false - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 5); - next(); - }); - }, - - function (next) { - request - .get('http://localhost:6767/test/') - .auth(null,null,false,"theToken") - .on('response', function (res) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 7); - next(); - }) - }, - - function (next) { - request - .get('http://localhost:6767/test/') - .auth(null,null,true,"theToken") - .on('response', function (res) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 8); - next(); - }) - }, - - function(next) { - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test/', - 'auth': { - 'bearer': function() { return 'theToken' }, - 'sendImmediately': false - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 10); - next(); - }); - }, - - function(next) { - // If we don't set sendImmediately = false, request will send bearer auth - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test2/', - 'auth': { - 'bearer': function() { return 'theToken' } - } - }, function(error, res, body) { - assert.equal(res.statusCode, 200); - assert.equal(numBasicRequests, 11); - next(); - }); - }, -]; - -function runTest(i) { - if (i < tests.length) { - tests[i](function() { - runTest(i + 1); - }); - } else { - console.log('All tests passed'); - basicServer.close(); - } -} - -runTest(0); diff --git a/packages/wekan-request/tests/test-body.js b/packages/wekan-request/tests/test-body.js deleted file mode 100644 index 186de123f..000000000 --- a/packages/wekan-request/tests/test-body.js +++ /dev/null @@ -1,122 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../index') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetEncoding : - { resp : server.createGetResponse(new Buffer('efa3bfcea9e29883', 'hex')) - , encoding: 'hex' - , expectBody: "efa3bfcea9e29883" - } - , testGetUTF8: - { resp: server.createGetResponse(new Buffer([0xEF, 0xBB, 0xBF, 226, 152, 131])) - , encoding: "utf8" - , expectBody: "☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - '<html><body>Oh hi.</body></html>' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'} - , {'body': 'Oh hi.'} - ] - } - , testPutMultipartPreambleCRLF : - { resp: server.createPostValidator( - '\r\n--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - '<html><body>Oh hi.</body></html>' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , preambleCRLF: true - , multipart: - [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/packages/wekan-request/tests/test-cookies.js b/packages/wekan-request/tests/test-cookies.js deleted file mode 100644 index 5f65d1083..000000000 --- a/packages/wekan-request/tests/test-cookies.js +++ /dev/null @@ -1,66 +0,0 @@ -try { - require('tough-cookie') -} catch (e) { - console.error('tough-cookie must be installed to run this test.') - console.error('skipping this test. please install tough-cookie and run again if you need to test this feature.') - process.exit(0) -} - -var assert = require('assert') - , http = require('http') - , request = require('../index') - - -function simpleCookieCreationTest() { - var cookie = request.cookie('foo=bar') - assert(cookie.key === 'foo') - assert(cookie.value === 'bar') -} - -simpleCookieCreationTest() - -var requests = 0; -var validUrl = 'http://localhost:6767/valid'; -var invalidUrl = 'http://localhost:6767/invalid'; - -var server = http.createServer(function (req, res) { - requests++; - if (req.url === '/valid') - res.setHeader('set-cookie', 'foo=bar'); - else if (req.url === '/invalid') - res.setHeader('set-cookie', 'foo=bar; Domain=foo.com'); - res.end('okay'); - if (requests === 2) server.close(); -}); -server.listen(6767); - -var jar1 = request.jar(); -request({ - method: 'GET', - url: validUrl, - jar: jar1 -}, -function (error, response, body) { - if (error) throw error; - assert.equal(jar1.getCookieString(validUrl), 'foo=bar'); - assert.equal(body, 'okay'); - - var cookies = jar1.getCookies(validUrl); - assert(cookies.length == 1); - assert(cookies[0].key === 'foo'); - assert(cookies[0].value === 'bar'); -}); - -var jar2 = request.jar(); -request({ - method: 'GET', - url: invalidUrl, - jar: jar2 -}, -function (error, response, body) { - if (error) throw error; - assert.equal(jar2.getCookieString(validUrl), ''); - assert.deepEqual(jar2.getCookies(validUrl), []); - assert.equal(body, 'okay'); -}); - diff --git a/packages/wekan-request/tests/test-defaults.js b/packages/wekan-request/tests/test-defaults.js deleted file mode 100644 index a6c57f7a8..000000000 --- a/packages/wekan-request/tests/test-defaults.js +++ /dev/null @@ -1,146 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../index') - ; - -var s = server.createServer(); - -s.listen(s.port, function () { - var counter = 0; - s.on('/get', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'GET') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end('TESTING!'); - }); - - // test get(string, function) - request.defaults({headers:{foo:"bar"}})(s.url + '/get', function (e, r, b){ - if (e) throw e; - assert.deepEqual("TESTING!", b); - counter += 1; - }); - - s.on('/merge-headers', function (req, resp) { - assert.equal(req.headers.foo, 'bar') - assert.equal(req.headers.merged, 'yes') - resp.writeHead(200) - resp.end() - }); - - request.defaults({ - headers:{foo:"bar", merged:"no"} - })(s.url + '/merge-headers', { - headers:{merged:"yes"} - }, function (e, r, b){ - if (e) throw e - assert.equal(r.statusCode, 200) - counter += 1 - }); - - s.on('/post', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], null); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post', {json: true}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/patch', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], null); - assert.equal(req.method, 'PATCH') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) - request.defaults({headers:{foo:"bar"}}).patch(s.url + '/patch', {json: true}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/post-body', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], 'application/json'); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) with body - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/del', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'DELETE') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test .del(string, function) - request.defaults({headers:{foo:"bar"}, json:true}).del(s.url + '/del', function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/head', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'HEAD') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test head.(object, function) - request.defaults({headers:{foo:"bar"}}).head({uri: s.url + '/head'}, function (e, r, b){ - if (e) throw e; - counter += 1; - }); - - s.on('/get_custom', function(req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers.x, 'y'); - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test custom request handler function - var defaultRequest = request.defaults({ - headers:{foo:"bar"} - , body: 'TESTING!' - }, function(uri, options, callback) { - var params = request.initParams(uri, options, callback); - options = params.options; - options.headers.x = 'y'; - - return request(params.uri, params.options, params.callback); - }); - - var msg = 'defaults test failed. head request should throw earlier'; - assert.throws(function() { - defaultRequest.head(s.url + '/get_custom', function(e, r, b) { - throw new Error(msg); - }); - counter+=1; - }, msg); - - defaultRequest.get(s.url + '/get_custom', function(e, r, b) { - if(e) throw e; - counter += 1; - console.log(counter.toString() + " tests passed."); - s.close(); - }); -}) diff --git a/packages/wekan-request/tests/test-digest-auth.js b/packages/wekan-request/tests/test-digest-auth.js deleted file mode 100644 index c99829340..000000000 --- a/packages/wekan-request/tests/test-digest-auth.js +++ /dev/null @@ -1,99 +0,0 @@ -var assert = require('assert') - , http = require('http') - , request = require('../index') - ; - -// Test digest auth -// Using header values captured from interaction with Apache - -var numDigestRequests = 0; - -var digestServer = http.createServer(function (req, res) { - console.error('Digest auth server: ', req.method, req.url); - numDigestRequests++; - - var ok; - - if (req.url === '/test/') { - if (req.headers.authorization) { - if (/^Digest username="test", realm="Private", nonce="WpcHS2\/TBAA=dffcc0dbd5f96d49a5477166649b7c0ae3866a93", uri="\/test\/", qop=auth, response="[a-f0-9]{32}", nc=00000001, cnonce="[a-f0-9]{32}", algorithm=MD5, opaque="5ccc069c403ebaf9f0171e9517f40e41"$/.exec(req.headers.authorization)) { - ok = true; - } else { - // Bad auth header, don't send back WWW-Authenticate header - ok = false; - } - } else { - // No auth header, send back WWW-Authenticate header - ok = false; - res.setHeader('www-authenticate', 'Digest realm="Private", nonce="WpcHS2/TBAA=dffcc0dbd5f96d49a5477166649b7c0ae3866a93", algorithm=MD5, qop="auth", opaque="5ccc069c403ebaf9f0171e9517f40e41"'); - } - } else if (req.url === '/dir/index.html') { - // RFC2069-compatible mode - // check: http://www.rfc-editor.org/errata_search.php?rfc=2069 - if (req.headers.authorization) { - if (/^Digest username="Mufasa", realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="\/dir\/index.html", response="[a-f0-9]{32}", opaque="5ccc069c403ebaf9f0171e9517f40e41"$/.exec(req.headers.authorization)) { - ok = true; - } else { - // Bad auth header, don't send back WWW-Authenticate header - ok = false; - } - } else { - // No auth header, send back WWW-Authenticate header - ok = false; - res.setHeader('www-authenticate', 'Digest realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"'); - } - } - - if (ok) { - console.log('request ok'); - res.end('ok'); - } else { - console.log('status=401'); - res.statusCode = 401; - res.end('401'); - } -}); - -digestServer.listen(6767); - -request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test/', - 'auth': { - 'user': 'test', - 'pass': 'testing', - 'sendImmediately': false - } -}, function(error, response, body) { - assert.equal(response.statusCode, 200); - assert.equal(numDigestRequests, 2); - - // If we don't set sendImmediately = false, request will send basic auth - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/test/', - 'auth': { - 'user': 'test', - 'pass': 'testing' - } - }, function(error, response, body) { - assert.equal(response.statusCode, 401); - assert.equal(numDigestRequests, 3); - - request({ - 'method': 'GET', - 'uri': 'http://localhost:6767/dir/index.html', - 'auth': { - 'user': 'Mufasa', - 'pass': 'CircleOfLife', - 'sendImmediately': false - } - }, function(error, response, body) { - assert.equal(response.statusCode, 200); - assert.equal(numDigestRequests, 5); - - console.log('All tests passed'); - digestServer.close(); - }); - }); -}); diff --git a/packages/wekan-request/tests/test-emptyBody.js b/packages/wekan-request/tests/test-emptyBody.js deleted file mode 100644 index 338c92e5e..000000000 --- a/packages/wekan-request/tests/test-emptyBody.js +++ /dev/null @@ -1,20 +0,0 @@ -var request = require('../index') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('') -}).listen(8080, function () { - var r = request('http://localhost:8080', function (e, resp, body) { - assert.equal(resp.statusCode, 200) - assert.equal(body, "") - - var r2 = request({ url: 'http://localhost:8080', json: {} }, function (e, resp, body) { - assert.equal(resp.statusCode, 200) - assert.equal(body, undefined) - s.close() - }); - }) -}) diff --git a/packages/wekan-request/tests/test-errors.js b/packages/wekan-request/tests/test-errors.js deleted file mode 100644 index 4df1302a0..000000000 --- a/packages/wekan-request/tests/test-errors.js +++ /dev/null @@ -1,37 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../index') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -try { - request(local, {multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/packages/wekan-request/tests/test-follow-all-303.js b/packages/wekan-request/tests/test-follow-all-303.js deleted file mode 100644 index 956e386d1..000000000 --- a/packages/wekan-request/tests/test-follow-all-303.js +++ /dev/null @@ -1,30 +0,0 @@ -var request = require('../index'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - console.error(req.method, req.url); - requests ++; - - if (req.method === 'POST') { - console.error('send 303'); - res.setHeader('location', req.url); - res.statusCode = 303; - res.end('try again, i guess\n'); - } else { - console.error('send 200') - res.end('ok: ' + requests); - } -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 2'); - assert.equal(requests, 2); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/packages/wekan-request/tests/test-follow-all.js b/packages/wekan-request/tests/test-follow-all.js deleted file mode 100644 index 1580677ac..000000000 --- a/packages/wekan-request/tests/test-follow-all.js +++ /dev/null @@ -1,44 +0,0 @@ -try { - require('tough-cookie') -} catch (e) { - console.error('tough-cookie must be installed to run this test.') - console.error('skipping this test. please install tough-cookie and run again if you need to test this feature.') - process.exit(0) -} - -var request = require('../index'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - requests ++; - - // redirect everything 3 times, no matter what. - var c = req.headers.cookie; - - if (!c) c = 0; - else c = +c.split('=')[1] || 0; - - if (c > 3) { - res.end('ok: '+requests); - return; - } - - res.setHeader('set-cookie', 'c=' + (c + 1)); - res.setHeader('location', req.url); - res.statusCode = 302; - res.end('try again, i guess\n'); -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - jar: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 5'); - assert.equal(requests, 5); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/packages/wekan-request/tests/test-form.js b/packages/wekan-request/tests/test-form.js deleted file mode 100644 index f229e61a4..000000000 --- a/packages/wekan-request/tests/test-form.js +++ /dev/null @@ -1,96 +0,0 @@ -try { - require('form-data') -} catch (e) { - console.error('form-data must be installed to run this test.') - console.error('skipping this test. please install form-data and run again if you need to test this feature.') - process.exit(0) -} - -var assert = require('assert') -var http = require('http'); -var path = require('path'); -var mime = require('mime-types'); -var request = require('../index'); -var fs = require('fs'); - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var totalLength = null; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - assert.ok( req.headers['content-length'] == totalLength ); - - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(8080, function() { - - var req = request.post('http://localhost:8080/upload', function () { - server.close(); - }) - var form = req.form() - - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - form.getLength(function (err, length) { - totalLength = length; - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/packages/wekan-request/tests/test-gzip.js b/packages/wekan-request/tests/test-gzip.js deleted file mode 100644 index b52826ee5..000000000 --- a/packages/wekan-request/tests/test-gzip.js +++ /dev/null @@ -1,105 +0,0 @@ -var request = require('../index') - , http = require('http') - , assert = require('assert') - , zlib = require('zlib') - -if (!zlib.Gunzip.prototype.setEncoding) { - try { - require('stringstream') - } catch (e) { - console.error('stringstream must be installed to run this test.') - console.error('skipping this test. please install stringstream and run again if you need to test this feature.') - process.exit(0) - } -} - -var testContent = 'Compressible response content.\n' - , testContentGzip - -var server = http.createServer(function (req, res) { - res.statusCode = 200 - res.setHeader('Content-Type', 'text/plain') - - if (/\bgzip\b/i.test(req.headers['accept-encoding'])) { - zlib.gzip(testContent, function (err, data) { - assert.ifError(err) - testContentGzip = data - res.setHeader('Content-Encoding', 'gzip') - res.end(data) - }) - } else { - res.end(testContent) - } -}) - -server.listen(6767, function (err) { - assert.ifError(err) - - var headers, options - - // Transparently supports gzip decoding to callbacks - options = { url: 'http://localhost:6767/foo', gzip: true } - request.get(options, function (err, res, body) { - assert.ifError(err) - assert.strictEqual(res.headers['content-encoding'], 'gzip') - assert.strictEqual(body, testContent) - }) - - - // Transparently supports gzip decoding to pipes - options = { url: 'http://localhost:6767/foo', gzip: true } - var chunks = [] - request.get(options) - .on('data', function (chunk) { chunks.push(chunk) }) - .on('end', function () { - assert.strictEqual(Buffer.concat(chunks).toString(), testContent) - }) - .on('error', function (err) { assert.ifError(err) }) - - - // Does not request gzip if user specifies Accepted-Encodings - headers = { 'Accept-Encoding': null } - options = { - url: 'http://localhost:6767/foo', - headers: headers, - gzip: true - } - request.get(options, function (err, res, body) { - assert.ifError(err) - assert.strictEqual(res.headers['content-encoding'], undefined) - assert.strictEqual(body, testContent) - }) - - - // Does not decode user-requested encoding by default - headers = { 'Accept-Encoding': 'gzip' } - options = { url: 'http://localhost:6767/foo', headers: headers } - request.get(options, function (err, res, body) { - assert.ifError(err) - assert.strictEqual(res.headers['content-encoding'], 'gzip') - assert.strictEqual(body, testContentGzip.toString()) - }) - - - // Supports character encoding with gzip encoding - headers = { 'Accept-Encoding': 'gzip' } - options = { - url: 'http://localhost:6767/foo', - headers: headers, - gzip: true, - encoding: "utf8" - } - var strings = [] - request.get(options) - .on('data', function (string) { - assert.strictEqual(typeof string, "string") - strings.push(string) - }) - .on('end', function () { - assert.strictEqual(strings.join(""), testContent) - - // Shutdown server after last test - server.close() - }) - .on('error', function (err) { assert.ifError(err) }) -}) diff --git a/packages/wekan-request/tests/test-hawk.js b/packages/wekan-request/tests/test-hawk.js deleted file mode 100755 index 2382f16e3..000000000 --- a/packages/wekan-request/tests/test-hawk.js +++ /dev/null @@ -1,41 +0,0 @@ -try { - require('hawk') -} catch (e) { - console.error('hawk must be installed to run this test.') - console.error('skipping this test. please install hawk and run again if you need to test this feature.') - process.exit(0) -} - -var createServer = require('http').createServer - , request = require('../index') - , hawk = require('hawk') - , assert = require('assert') - ; - -var server = createServer(function (req, resp) { - - var getCred = function (id, callback) { - assert.equal(id, 'dh37fgj492je') - var credentials = - { key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn' - , algorithm: 'sha256' - , user: 'Steve' - } - return callback(null, credentials) - } - - hawk.server.authenticate(req, getCred, {}, function (err, credentials, attributes) { - resp.writeHead(!err ? 200 : 401, { 'Content-Type': 'text/plain' }) - resp.end(!err ? 'Hello ' + credentials.user : 'Shoosh!') - }) - -}) - -server.listen(8080, function () { - var creds = {key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn', algorithm: 'sha256', id:'dh37fgj492je'} - request('http://localhost:8080', {hawk:{credentials:creds}}, function (e, r, b) { - assert.equal(200, r.statusCode) - assert.equal(b, 'Hello Steve') - server.close() - }) -}) \ No newline at end of file diff --git a/packages/wekan-request/tests/test-headers.js b/packages/wekan-request/tests/test-headers.js deleted file mode 100644 index 0b0562201..000000000 --- a/packages/wekan-request/tests/test-headers.js +++ /dev/null @@ -1,79 +0,0 @@ -try { - require('tough-cookie') -} catch (e) { - console.error('tough-cookie must be installed to run this test.') - console.error('skipping this test. please install tough-cookie and run again if you need to test this feature.') - process.exit(0) -} - -var server = require('./server') - , assert = require('assert') - , request = require('../index') - , s = server.createServer() - -s.listen(s.port, function () { - var serverUri = 'http://localhost:' + s.port - , numTests = 0 - , numOutstandingTests = 0 - - function createTest(requestObj, serverAssertFn) { - var testNumber = numTests; - numTests += 1; - numOutstandingTests += 1; - s.on('/' + testNumber, function (req, res) { - serverAssertFn(req, res); - res.writeHead(200); - res.end(); - }); - requestObj.url = serverUri + '/' + testNumber - request(requestObj, function (err, res, body) { - assert.ok(!err) - assert.equal(res.statusCode, 200) - numOutstandingTests -= 1 - if (numOutstandingTests === 0) { - console.log(numTests + ' tests passed.') - s.close() - } - }) - } - - // Issue #125: headers.cookie shouldn't be replaced when a cookie jar isn't specified - createTest({headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar') - }) - - // Issue #125: headers.cookie + cookie jar - //using new cookie module - var jar = request.jar() - jar.setCookie('quux=baz', serverUri); - createTest({jar: jar, headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar; quux=baz') - }) - - // Issue #794 add ability to ignore cookie parsing and domain errors - var jar2 = request.jar() - jar2.setCookie('quux=baz; Domain=foo.bar.com', serverUri, {ignoreError: true}); - createTest({jar: jar2, headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar') - }) - - // Issue #784: override content-type when json is used - // https://github.com/mikeal/request/issues/784 - createTest({ - json: true, - method: 'POST', - headers: {'content-type': 'application/json; charset=UTF-8'}, - body: {hello: 'my friend'}},function(req, res) { - assert.ok(req.headers['content-type']); - assert.equal(req.headers['content-type'], 'application/json; charset=UTF-8'); - } - ) - - // There should be no cookie header when neither headers.cookie nor a cookie jar is specified - createTest({}, function (req, res) { - assert.ok(!req.headers.cookie) - }) -}) diff --git a/packages/wekan-request/tests/test-http-signature.js b/packages/wekan-request/tests/test-http-signature.js deleted file mode 100755 index ee04cfbb4..000000000 --- a/packages/wekan-request/tests/test-http-signature.js +++ /dev/null @@ -1,114 +0,0 @@ -try { - require('http-signature') -} catch (e) { - console.error('http-signature must be installed to run this test.') - console.error('skipping this test. please install http-signature and run again if you need to test this feature.') - process.exit(0) -} - -var createServer = require('http').createServer - , request = require('../index') - , httpSignature = require('http-signature') - , assert = require('assert') - ; - -var privateKeyPEMs = {} - -privateKeyPEMs['key-1'] = - '-----BEGIN RSA PRIVATE KEY-----\n' + - 'MIIEpAIBAAKCAQEAzWSJl+Z9Bqv00FVL5N3+JCUoqmQPjIlya1BbeqQroNQ5yG1i\n' + - 'VbYTTnMRa1zQtR6r2fNvWeg94DvxivxIG9diDMnrzijAnYlTLOl84CK2vOxkj5b6\n' + - '8zrLH9b/Gd6NOHsywo8IjvXvCeTfca5WUHcuVi2lT9VjygFs1ILG4RyeX1BXUumu\n' + - 'Y8fzmposxLYdMxCqUTzAn0u9Saq2H2OVj5u114wS7OQPigu6G99dpn/iPHa3zBm8\n' + - '7baBWDbqZWRW0BP3K6eqq8sut1+NLhNW8ADPTdnO/SO+kvXy7fqd8atSn+HlQcx6\n' + - 'tW42dhXf3E9uE7K78eZtW0KvfyNGAjsI1Fft2QIDAQABAoIBAG1exe3/LEBrPLfb\n' + - 'U8iRdY0lxFvHYIhDgIwohC3wUdMYb5SMurpNdEZn+7Sh/fkUVgp/GKJViu1mvh52\n' + - 'bKd2r52DwG9NQBQjVgkqY/auRYSglIPpr8PpYNSZlcneunCDGeqEY9hMmXc5Ssqs\n' + - 'PQYoEKKPN+IlDTg6PguDgAfLR4IUvt9KXVvmB/SSgV9tSeTy35LECt1Lq3ozbUgu\n' + - '30HZI3U6/7H+X22Pxxf8vzBtzkg5rRCLgv+OeNPo16xMnqbutt4TeqEkxRv5rtOo\n' + - '/A1i9khBeki0OJAFJsE82qnaSZodaRsxic59VnN8sWBwEKAt87tEu5A3K3j4XSDU\n' + - '/avZxAECgYEA+pS3DvpiQLtHlaO3nAH6MxHRrREOARXWRDe5nUQuUNpS1xq9wte6\n' + - 'DkFtba0UCvDLic08xvReTCbo9kH0y6zEy3zMpZuJlKbcWCkZf4S5miYPI0RTZtF8\n' + - 'yps6hWqzYFSiO9hMYws9k4OJLxX0x3sLK7iNZ32ujcSrkPBSiBr0gxkCgYEA0dWl\n' + - '637K41AJ/zy0FP0syq+r4eIkfqv+/t6y2aQVUBvxJYrj9ci6XHBqoxpDV8lufVYj\n' + - 'fUAfeI9/MZaWvQJRbnYLre0I6PJfLuCBIL5eflO77BGso165AF7QJZ+fwtgKv3zv\n' + - 'ZX75eudCSS/cFo0po9hlbcLMT4B82zEkgT8E2MECgYEAnz+3/wrdOmpLGiyL2dff\n' + - '3GjsqmJ2VfY8z+niSrI0BSpbD11tT9Ct67VlCBjA7hsOH6uRfpd6/kaUMzzDiFVq\n' + - 'VDAiFvV8QD6zNkwYalQ9aFvbrvwTTPrBpjl0vamMCiJ/YC0cjq1sGr2zh3sar1Ph\n' + - 'S43kP+s97dcZeelhaiJHVrECgYEAsx61q/loJ/LDFeYzs1cLTVn4V7I7hQY9fkOM\n' + - 'WM0AhInVqD6PqdfXfeFYpjJdGisQ7l0BnoGGW9vir+nkcyPvb2PFRIr6+B8tsU5j\n' + - '7BeVgjDoUfQkcrEBK5fEBtnj/ud9BUkY8oMZZBjVNLRuI7IMwZiPvMp0rcj4zAN/\n' + - 'LfUlpgECgYArBvFcBxSkNAzR3Rtteud1YDboSKluRM37Ey5plrn4BS0DD0jm++aD\n' + - '0pG2Hsik000hibw92lCkzvvBVAqF8BuAcnPlAeYfsOaa97PGEjSKEN5bJVWZ9/om\n' + - '9FV1axotRN2XWlwrhixZLEaagkREXhgQc540FS5O8IaI2Vpa80Atzg==\n' + - '-----END RSA PRIVATE KEY-----' - -var publicKeyPEMs = {} - -publicKeyPEMs['key-1'] = - '-----BEGIN PUBLIC KEY-----\n' + - 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzWSJl+Z9Bqv00FVL5N3+\n' + - 'JCUoqmQPjIlya1BbeqQroNQ5yG1iVbYTTnMRa1zQtR6r2fNvWeg94DvxivxIG9di\n' + - 'DMnrzijAnYlTLOl84CK2vOxkj5b68zrLH9b/Gd6NOHsywo8IjvXvCeTfca5WUHcu\n' + - 'Vi2lT9VjygFs1ILG4RyeX1BXUumuY8fzmposxLYdMxCqUTzAn0u9Saq2H2OVj5u1\n' + - '14wS7OQPigu6G99dpn/iPHa3zBm87baBWDbqZWRW0BP3K6eqq8sut1+NLhNW8ADP\n' + - 'TdnO/SO+kvXy7fqd8atSn+HlQcx6tW42dhXf3E9uE7K78eZtW0KvfyNGAjsI1Fft\n' + - '2QIDAQAB\n' + - '-----END PUBLIC KEY-----' - -publicKeyPEMs['key-2'] = - '-----BEGIN PUBLIC KEY-----\n' + - 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqp04VVr9OThli9b35Omz\n' + - 'VqSfWbsoQuRrgyWsrNRn3XkFmbWw4FzZwQ42OgGMzQ84Ta4d9zGKKQyFriTiPjPf\n' + - 'xhhrsaJnDuybcpVhcr7UNKjSZ0S59tU3hpRiEz6hO+Nc/OSSLkvalG0VKrxOln7J\n' + - 'LK/h3rNS/l6wDZ5S/KqsI6CYtV2ZLpn3ahLrizvEYNY038Qcm38qMWx+VJAvZ4di\n' + - 'qqmW7RLIsLT59SWmpXdhFKnkYYGhxrk1Mwl22dBTJNY5SbriU5G3gWgzYkm8pgHr\n' + - '6CtrXch9ciJAcDJehPrKXNvNDOdUh8EW3fekNJerF1lWcwQg44/12v8sDPyfbaKB\n' + - 'dQIDAQAB\n' + - '-----END PUBLIC KEY-----' - -var server = createServer(function (req, res) { - var parsed = httpSignature.parseRequest(req) - var publicKeyPEM = publicKeyPEMs[parsed.keyId] - var verified = httpSignature.verifySignature(parsed, publicKeyPEM) - res.writeHead(verified ? 200 : 400) - res.end() -}) - -server.listen(8080, function () { - function correctKeyTest(callback) { - var options = { - httpSignature: { - keyId: 'key-1', - key: privateKeyPEMs['key-1'] - } - } - request('http://localhost:8080', options, function (e, r, b) { - assert.equal(200, r.statusCode) - callback() - }) - } - - function incorrectKeyTest(callback) { - var options = { - httpSignature: { - keyId: 'key-2', - key: privateKeyPEMs['key-1'] - } - } - request('http://localhost:8080', options, function (e, r, b) { - assert.equal(400, r.statusCode) - callback() - }) - } - - var tests = [correctKeyTest, incorrectKeyTest] - var todo = tests.length; - for(var i = 0; i < tests.length; ++i) { - tests[i](function() { - if(!--todo) { - server.close() - } - }) - } -}) diff --git a/packages/wekan-request/tests/test-httpModule.js b/packages/wekan-request/tests/test-httpModule.js deleted file mode 100644 index 2c19615f7..000000000 --- a/packages/wekan-request/tests/test-httpModule.js +++ /dev/null @@ -1,94 +0,0 @@ -var http = require('http') - , https = require('https') - , server = require('./server') - , assert = require('assert') - , request = require('../index') - - -var faux_requests_made = {'http':0, 'https':0} -function wrap_request(name, module) { - // Just like the http or https module, but note when a request is made. - var wrapped = {} - Object.keys(module).forEach(function(key) { - var value = module[key]; - - if(key != 'request') - wrapped[key] = value; - else - wrapped[key] = function(options, callback) { - faux_requests_made[name] += 1 - return value.apply(this, arguments) - } - }) - - return wrapped; -} - - -var faux_http = wrap_request('http', http) - , faux_https = wrap_request('https', https) - , plain_server = server.createServer() - , https_server = server.createSSLServer() - - -plain_server.listen(plain_server.port, function() { - plain_server.on('/plain', function (req, res) { - res.writeHead(200) - res.end('plain') - }) - plain_server.on('/to_https', function (req, res) { - res.writeHead(301, {'location':'https://localhost:'+https_server.port + '/https'}) - res.end() - }) - - https_server.listen(https_server.port, function() { - https_server.on('/https', function (req, res) { - res.writeHead(200) - res.end('https') - }) - https_server.on('/to_plain', function (req, res) { - res.writeHead(302, {'location':'http://localhost:'+plain_server.port + '/plain'}) - res.end() - }) - - run_tests() - run_tests({}) - run_tests({'http:':faux_http}) - run_tests({'https:':faux_https}) - run_tests({'http:':faux_http, 'https:':faux_https}) - }) -}) - -function run_tests(httpModules) { - var to_https = 'http://localhost:'+plain_server.port+'/to_https' - var to_plain = 'https://localhost:'+https_server.port+'/to_plain' - - request(to_https, {'httpModules':httpModules, strictSSL:false}, function (er, res, body) { - if (er) throw er - assert.equal(body, 'https', 'Received HTTPS server body') - done() - }) - - request(to_plain, {'httpModules':httpModules, strictSSL:false}, function (er, res, body) { - if (er) throw er - assert.equal(body, 'plain', 'Received HTTPS server body') - done() - }) -} - - -var passed = 0; -function done() { - passed += 1 - var expected = 10 - - if(passed == expected) { - plain_server.close() - https_server.close() - - assert.equal(faux_requests_made.http, 4, 'Wrapped http module called appropriately') - assert.equal(faux_requests_made.https, 4, 'Wrapped https module called appropriately') - - console.log((expected+2) + ' tests passed.') - } -} diff --git a/packages/wekan-request/tests/test-https-strict.js b/packages/wekan-request/tests/test-https-strict.js deleted file mode 100644 index d49a9afcb..000000000 --- a/packages/wekan-request/tests/test-https-strict.js +++ /dev/null @@ -1,97 +0,0 @@ -// a test where we validate the siguature of the keys -// otherwise exactly the same as the ssl test - -var server = require('./server') - , assert = require('assert') - , request = require('../index') - , fs = require('fs') - , path = require('path') - , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key') - , cert: path.resolve(__dirname, 'ssl/ca/server.crt') } - , s = server.createSSLServer(null, opts) - , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt') - , ca = fs.readFileSync(caFile) - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - '<html><body>Oh hi.</body></html>' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - test.strictSSL = true - test.ca = ca - test.headers = { host: 'testing.request.mikealrogers.com' } - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/packages/wekan-request/tests/test-https.js b/packages/wekan-request/tests/test-https.js deleted file mode 100644 index b6858d433..000000000 --- a/packages/wekan-request/tests/test-https.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../index') - -var s = server.createSSLServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - '<html><body>Oh hi.</body></html>' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - test.rejectUnauthorized = false - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/packages/wekan-request/tests/test-isUrl.js b/packages/wekan-request/tests/test-isUrl.js deleted file mode 100644 index 4a51ad018..000000000 --- a/packages/wekan-request/tests/test-isUrl.js +++ /dev/null @@ -1,28 +0,0 @@ -var assert = require('assert') - , request = require('../index') - , http = require('http') - ; - -var s = http.createServer(function(req, res) { - res.statusCode = 200; - res.end(''); -}).listen(6767, function () { - - // Test lowercase - request('http://localhost:6767', function (err, resp, body) { - // just need to get here without throwing an error - assert.equal(true, true); - }) - - // Test uppercase - request('HTTP://localhost:6767', function (err, resp, body) { - assert.equal(true, true); - }) - - // Test mixedcase - request('HtTp://localhost:6767', function (err, resp, body) { - assert.equal(true, true); - // clean up - s.close(); - }) -}) \ No newline at end of file diff --git a/packages/wekan-request/tests/test-localAddress.js b/packages/wekan-request/tests/test-localAddress.js deleted file mode 100644 index 11a1bd125..000000000 --- a/packages/wekan-request/tests/test-localAddress.js +++ /dev/null @@ -1,15 +0,0 @@ -var request = require('../index') - , assert = require('assert') - ; - -request.get({ - uri: 'http://www.google.com', localAddress: '1.2.3.4' // some invalid address -}, function(err, res) { - assert(!res) // asserting that no response received -}) - -request.get({ - uri: 'http://www.google.com', localAddress: '127.0.0.1' -}, function(err, res) { - assert(!res) // asserting that no response received -}) diff --git a/packages/wekan-request/tests/test-node-debug.js b/packages/wekan-request/tests/test-node-debug.js deleted file mode 100644 index a34253270..000000000 --- a/packages/wekan-request/tests/test-node-debug.js +++ /dev/null @@ -1,26 +0,0 @@ -var assert = require('assert') - , request = require('../index') - , http = require('http') - ; - -var s = http.createServer(function(req, res) { - res.statusCode = 200 - res.end('') -}).listen(6767, function () { - // a simple request should not fail with NODE_DEBUG - process.env.NODE_DEBUG = 'mumblemumble,request' - - var stderr = '' - process.stderr.write = (function(write) { - return function(string, encoding, fd) { - stderr += string - } - })(process.stderr.write) - - request('http://localhost:6767', function (err, resp, body) { - assert.ifError(err, 'the request did not fail') - assert.ok(resp, 'the request did not fail') - assert.ok(/REQUEST/.test(stderr), 'stderr has some messages') - s.close(); // clean up - }) -}) diff --git a/packages/wekan-request/tests/test-oauth.js b/packages/wekan-request/tests/test-oauth.js deleted file mode 100644 index e57a761c2..000000000 --- a/packages/wekan-request/tests/test-oauth.js +++ /dev/null @@ -1,125 +0,0 @@ -try { - require('oauth-sign') -} catch (e) { - console.error('oauth-sign must be installed to run this test.') - console.error('skipping this test. please install oauth-sign and run again if you need to test this feature.') - process.exit(0) -} - -var hmacsign = require('oauth-sign').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../index') - ; - -function getsignature (r) { - var sign - r.headers.Authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var rsign = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -setTimeout(function () { - console.log(getsignature(rsign)) - assert.equal(reqsign, getsignature(rsign)) -}) - -var raccsign = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -setTimeout(function () { - console.log(getsignature(raccsign)) - assert.equal(accsign, getsignature(raccsign)) -}, 1) - -var rupsign = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) -setTimeout(function () { - console.log(getsignature(rupsign)) - assert.equal(upsign, getsignature(rupsign)) -}, 1) - - - - diff --git a/packages/wekan-request/tests/test-onelineproxy.js b/packages/wekan-request/tests/test-onelineproxy.js deleted file mode 100644 index c239f8921..000000000 --- a/packages/wekan-request/tests/test-onelineproxy.js +++ /dev/null @@ -1,46 +0,0 @@ -var http = require('http') - , assert = require('assert') - , request = require('../index') - ; - -var server = http.createServer(function (req, resp) { - resp.statusCode = 200 - if (req.url === '/get') { - assert.equal(req.method, 'GET') - resp.write('content') - resp.end() - return - } - if (req.url === '/put') { - var x = '' - assert.equal(req.method, 'PUT') - req.on('data', function (chunk) { - x += chunk - }) - req.on('end', function () { - assert.equal(x, 'content') - resp.write('success') - resp.end() - }) - return - } - if (req.url === '/proxy') { - assert.equal(req.method, 'PUT') - return req.pipe(request('http://localhost:8080/put')).pipe(resp) - } - - if (req.url === '/test') { - return request('http://localhost:8080/get').pipe(request.put('http://localhost:8080/proxy')).pipe(resp) - } - throw new Error('Unknown url', req.url) -}).listen(8080, function () { - request('http://localhost:8080/test', function (e, resp, body) { - if (e) throw e - if (resp.statusCode !== 200) throw new Error('statusCode not 200 ' + resp.statusCode) - assert.equal(body, 'success') - server.close() - }) -}) - - - diff --git a/packages/wekan-request/tests/test-option-reuse.js b/packages/wekan-request/tests/test-option-reuse.js deleted file mode 100644 index c3ac4906a..000000000 --- a/packages/wekan-request/tests/test-option-reuse.js +++ /dev/null @@ -1,38 +0,0 @@ -var assert = require('assert') - , request = require('../index') - , http = require('http') - ; - -var count = 0; -var methodsSeen = { - head: 0 -, get: 0 -}; - -var s = http.createServer(function(req, res) { - res.statusCode = 200; - res.end(''); - count++; - - if (req.method.toLowerCase() === 'head') methodsSeen.head++; - if (req.method.toLowerCase() === 'get') methodsSeen.get++; - - if (count < 2) return - assert(methodsSeen.head === 1); - assert(methodsSeen.get === 1); -}).listen(6767, function () { - - //this is a simple check to see if the options object is be mutilated - var url = 'http://localhost:6767'; - var options = {url: url}; - - request.head(options, function (err, resp, body) { - assert(Object.keys(options).length === 1); - assert(options.url === url); - request.get(options, function (err, resp, body) { - assert(Object.keys(options).length === 1); - assert(options.url === url); - s.close(); - }) - }) -}) \ No newline at end of file diff --git a/packages/wekan-request/tests/test-params.js b/packages/wekan-request/tests/test-params.js deleted file mode 100644 index a5831a140..000000000 --- a/packages/wekan-request/tests/test-params.js +++ /dev/null @@ -1,93 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../index') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - '<html><body>Oh hi.</body></html>' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - //test.uri = s.url + '/' + i - request(s.url + '/' + i, test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - assert.notEqual(typeof test.callback, 'function') - console.log(1 + Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/packages/wekan-request/tests/test-piped-redirect.js b/packages/wekan-request/tests/test-piped-redirect.js deleted file mode 100644 index e295ec7fa..000000000 --- a/packages/wekan-request/tests/test-piped-redirect.js +++ /dev/null @@ -1,42 +0,0 @@ -var http = require('http') - , assert = require('assert') - , request = require('../index') - ; - -var portOne = 8968 - , portTwo = 8969 - ; - - -// server one -var s1 = http.createServer(function (req, resp) { - if (req.url == '/original') { - resp.writeHeader(302, {'location': '/redirected'}) - resp.end() - } else if (req.url == '/redirected') { - resp.writeHeader(200, {'content-type': 'text/plain'}) - resp.write('OK') - resp.end() - } - -}).listen(portOne); - - -// server two -var s2 = http.createServer(function (req, resp) { - var x = request('http://localhost:'+portOne+'/original') - req.pipe(x) - x.pipe(resp) - -}).listen(portTwo, function () { - var r = request('http://localhost:'+portTwo+'/original', function (err, res, body) { - assert.equal(body, 'OK') - - s1.close() - s2.close() - }); - - // it hangs, so wait a second :) - r.timeout = 1000; - -}) diff --git a/packages/wekan-request/tests/test-pipes.js b/packages/wekan-request/tests/test-pipes.js deleted file mode 100644 index ca1f58452..000000000 --- a/packages/wekan-request/tests/test-pipes.js +++ /dev/null @@ -1,231 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../index') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) this.emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - var counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - // Test pipeing to a request object with a json body - s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); - - var mybodydata = new stream.Stream(); - mybodydata.readable = true - - counter++ - var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { - check(); - }) - mybodydata.pipe(r2) - - mybodydata.emit('data', JSON.stringify({foo:"bar"})); - mybodydata.emit('end'); - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'application/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/jpeg'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.jpg')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.jpg')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.jpg')), fs.readFileSync(path.join(__dirname, 'test.jpg'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.jpg')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - - s.on('/forward1', function (req, resp) { - resp.writeHead(302, {location:'/forward2'}) - resp.end() - }) - s.on('/forward2', function (req, resp) { - resp.writeHead('200', {'content-type':'image/png'}) - resp.write('d') - resp.end() - }) - - counter++ - var validateForward = new ValidationStream('d') - validateForward.on('end', check) - request.get('http://localhost:3453/forward1').pipe(validateForward) - - // Test pipe options - s.once('/opts', server.createGetResponse('opts response')); - - var optsStream = new stream.Stream(); - optsStream.writable = true - - var optsData = ''; - optsStream.write = function (buf) { - optsData += buf; - if (optsData === 'opts response') { - setTimeout(check, 10); - } - } - - optsStream.end = function () { - assert.fail('end called') - }; - - counter++ - request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false }) - - // test request.pipefilter is called correctly - counter++ - s.on('/pipefilter', function(req, resp) { - resp.end('d') - }) - var validatePipeFilter = new ValidationStream('d') - - var r3 = request.get('http://localhost:3453/pipefilter') - r3.pipe(validatePipeFilter) - r3.pipefilter = function(resp, dest) { - assert.equal(resp, r3.response) - assert.equal(dest, validatePipeFilter) - check() - } -}) diff --git a/packages/wekan-request/tests/test-pool.js b/packages/wekan-request/tests/test-pool.js deleted file mode 100644 index 791ee8b93..000000000 --- a/packages/wekan-request/tests/test-pool.js +++ /dev/null @@ -1,16 +0,0 @@ -var request = require('../index') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200; - resp.end('asdf'); -}).listen(8080, function () { - request({'url': 'http://localhost:8080', 'pool': false}, function (e, resp) { - var agent = resp.request.agent; - assert.strictEqual(typeof agent, 'boolean'); - assert.strictEqual(agent, false); - s.close(); - }); -}); \ No newline at end of file diff --git a/packages/wekan-request/tests/test-protocol-changing-redirect.js b/packages/wekan-request/tests/test-protocol-changing-redirect.js deleted file mode 100644 index 7e83a41bd..000000000 --- a/packages/wekan-request/tests/test-protocol-changing-redirect.js +++ /dev/null @@ -1,61 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../index') - - -var s = server.createServer() -var ss = server.createSSLServer() -var sUrl = 'http://localhost:' + s.port -var ssUrl = 'https://localhost:' + ss.port - -s.listen(s.port, bouncy(s, ssUrl)) -ss.listen(ss.port, bouncy(ss, sUrl)) - -var hits = {} -var expect = {} -var pending = 0 -function bouncy (s, server) { return function () { - - var redirs = { a: 'b' - , b: 'c' - , c: 'd' - , d: 'e' - , e: 'f' - , f: 'g' - , g: 'h' - , h: 'end' } - - var perm = true - Object.keys(redirs).forEach(function (p) { - var t = redirs[p] - - // switch type each time - var type = perm ? 301 : 302 - perm = !perm - s.on('/' + p, function (req, res) { - res.writeHead(type, { location: server + '/' + t }) - res.end() - }) - }) - - s.on('/end', function (req, res) { - var h = req.headers['x-test-key'] - hits[h] = true - pending -- - if (pending === 0) done() - }) -}} - -for (var i = 0; i < 5; i ++) { - pending ++ - var val = 'test_' + i - expect[val] = true - request({ url: (i % 2 ? sUrl : ssUrl) + '/a' - , headers: { 'x-test-key': val } - , rejectUnauthorized: false }) -} - -function done () { - assert.deepEqual(hits, expect) - process.exit(0) -} diff --git a/packages/wekan-request/tests/test-proxy-env.js b/packages/wekan-request/tests/test-proxy-env.js deleted file mode 100644 index caeb33416..000000000 --- a/packages/wekan-request/tests/test-proxy-env.js +++ /dev/null @@ -1,41 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../index') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -// set up environment variable -process.env.HTTP_PROXY = 'http://localhost:'+port; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - /* should read from HTTP_PROXY env var and - // behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/packages/wekan-request/tests/test-proxy-null.js b/packages/wekan-request/tests/test-proxy-null.js deleted file mode 100644 index 7688cf756..000000000 --- a/packages/wekan-request/tests/test-proxy-null.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../index') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -// set up environment variable -process.env.HTTP_PROXY = 'http://localhost:'+port; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - // should not read from HTTP_PROXY env var - proxy: null, - timeout: 500, - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(!called, 'the request must not be made to the proxy server') -}) diff --git a/packages/wekan-request/tests/test-proxy.js b/packages/wekan-request/tests/test-proxy.js deleted file mode 100644 index e183d68d1..000000000 --- a/packages/wekan-request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../index') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/packages/wekan-request/tests/test-qs.js b/packages/wekan-request/tests/test-qs.js deleted file mode 100644 index 65958e6a3..000000000 --- a/packages/wekan-request/tests/test-qs.js +++ /dev/null @@ -1,42 +0,0 @@ -var request = request = require('../index') - , assert = require('assert') - ; - - -// Test adding a querystring -var req1 = request.get({ uri: 'http://www.google.com', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req1.path) -}, 1) - -// Test replacing a querystring value -var req2 = request.get({ uri: 'http://www.google.com?q=abc', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req2.path) -}, 1) - -// Test appending a querystring value to the ones present in the uri -var req3 = request.get({ uri: 'http://www.google.com?x=y', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?x=y&q=search', req3.path) -}, 1) - -// Test leaving a querystring alone -var req4 = request.get({ uri: 'http://www.google.com?x=y'}) -setTimeout(function() { - assert.equal('/?x=y', req4.path) -}, 1) - -// Test giving empty qs property -var req5 = request.get({ uri: 'http://www.google.com', qs: {}}) -setTimeout(function(){ - assert.equal('/', req5.path) -}, 1) - - -// Test modifying the qs after creating the request -var req6 = request.get({ uri: 'http://www.google.com', qs: {}}); -req6.qs({ q: "test" }); -process.nextTick(function() { - assert.equal('/?q=test', req6.path); -}); diff --git a/packages/wekan-request/tests/test-redirect.js b/packages/wekan-request/tests/test-redirect.js deleted file mode 100644 index 67274351c..000000000 --- a/packages/wekan-request/tests/test-redirect.js +++ /dev/null @@ -1,166 +0,0 @@ -try { - require('tough-cookie') -} catch (e) { - console.error('tough-cookie must be installed to run this test.') - console.error('skipping this test. please install tough-cookie and run again if you need to test this feature.') - process.exit(0) -} - -var server = require('./server') - , assert = require('assert') - , request = require('../index') - ; - -var s = server.createServer() - -s.listen(s.port, function () { - var server = 'http://localhost:' + s.port; - var hits = {} - var passed = 0; - - bouncer(301, 'temp') - bouncer(302, 'perm') - bouncer(302, 'nope') - bouncer(307, 'fwd') - - function bouncer(code, label) { - var landing = label+'_landing'; - - s.on('/'+label, function (req, res) { - hits[label] = true; - res.writeHead(code, { - 'location':server + '/'+landing, - 'set-cookie': 'ham=eggs' - }) - res.end() - }) - - s.on('/'+landing, function (req, res) { - // Make sure the cookie doesn't get included twice, see #139: - // Make sure cookies are set properly after redirect - assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs'); - hits[landing] = true; - res.writeHead(200) - res.end(req.method.toUpperCase() + ' ' + landing) - }) - } - - // Permanent bounce - var jar = request.jar() - jar.setCookie('quux=baz', server); - request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.perm, 'Original request is to /perm') - assert.ok(hits.perm_landing, 'Forward to permanent landing URL') - assert.equal(body, 'GET perm_landing', 'Got permanent landing content') - passed += 1 - done() - }) - - // Temporary bounce - request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'GET temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - // Prevent bouncing. - request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode) - assert.ok(hits.nope, 'Original request to /nope') - assert.ok(!hits.nope_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 302, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow post redirects by default - request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when post') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow post redirects when followAllRedirects true - request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'GET temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects by default - request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode < 301) throw new Error('Status is not a redirect.') - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects even if followRedirect is set to true - request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow delete redirects when followAllRedirects true - request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'GET temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - request.del(server+'/fwd', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.fwd, 'Original request is to /fwd') - assert.ok(hits.fwd_landing, 'Forward to temporary landing URL') - assert.equal(body, 'DELETE fwd_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - var reqs_done = 0; - function done() { - reqs_done += 1; - if(reqs_done == 10) { - console.log(passed + ' tests passed.') - s.close() - } - } -}) diff --git a/packages/wekan-request/tests/test-timeout.js b/packages/wekan-request/tests/test-timeout.js deleted file mode 100644 index e04d0e4c7..000000000 --- a/packages/wekan-request/tests/test-timeout.js +++ /dev/null @@ -1,100 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../index') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 6; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - var shouldTimeoutWithEvents = { - url: s.url + "/timeout", - timeout:100 - } - - var eventsEmitted = 0; - request(shouldTimeoutWithEvents) - .on('error', function (err) { - eventsEmitted++; - assert.equal(err.code, eventsEmitted == 1 ? "ETIMEDOUT" : "ECONNRESET"); - checkDone(); - }) - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/packages/wekan-request/tests/test-toJSON.js b/packages/wekan-request/tests/test-toJSON.js deleted file mode 100644 index 6d5f92aaa..000000000 --- a/packages/wekan-request/tests/test-toJSON.js +++ /dev/null @@ -1,14 +0,0 @@ -var request = require('../index') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('asdf') -}).listen(8080, function () { - var r = request('http://localhost:8080', function (e, resp) { - assert.equal(JSON.parse(JSON.stringify(r)).response.statusCode, 200) - s.close() - }) -}) \ No newline at end of file diff --git a/packages/wekan-request/tests/test-tunnel.js b/packages/wekan-request/tests/test-tunnel.js deleted file mode 100644 index 2ee3f393e..000000000 --- a/packages/wekan-request/tests/test-tunnel.js +++ /dev/null @@ -1,75 +0,0 @@ -// test that we can tunnel a https request over an http proxy -// keeping all the CA and whatnot intact. -// -// Note: this requires that squid is installed. -// If the proxy fails to start, we'll just log a warning and assume success. - -var server = require('./server') - , assert = require('assert') - , request = require('../index') - , fs = require('fs') - , path = require('path') - , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt') - , ca = fs.readFileSync(caFile) - , child_process = require('child_process') - , sqConf = path.resolve(__dirname, 'squid.conf') - , sqArgs = ['-f', sqConf, '-N', '-d', '5'] - , proxy = 'http://localhost:3128' - , hadError = null - -var squid = child_process.spawn('squid', sqArgs); -var ready = false - -squid.stderr.on('data', function (c) { - console.error('SQUIDERR ' + c.toString().trim().split('\n') - .join('\nSQUIDERR ')) - ready = c.toString().match(/ready to serve requests|Accepting HTTP Socket connections/i) -}) - -squid.stdout.on('data', function (c) { - console.error('SQUIDOUT ' + c.toString().trim().split('\n') - .join('\nSQUIDOUT ')) -}) - -squid.on('error', function (c) { - console.error('squid: error '+c) - if (c && !ready) { - notInstalled() - return - } -}) - -squid.on('exit', function (c) { - console.error('squid: exit '+c) - if (c && !ready) { - notInstalled() - return - } - - if (c) { - hadError = hadError || new Error('Squid exited with '+c) - } - if (hadError) throw hadError -}) - -setTimeout(function F () { - if (!ready) return setTimeout(F, 100) - request({ uri: 'https://registry.npmjs.org/' - , proxy: 'http://localhost:3128' - , strictSSL: true - , ca: ca - , json: true }, function (er, body) { - hadError = er - console.log(er || typeof body) - if (!er) console.log("ok") - squid.kill('SIGKILL') - }) -}, 100) - -function notInstalled() { - console.error('squid must be installed to run this test.') - console.error('skipping this test. please install squid and run again if you need to test tunneling.') - c = null - hadError = null - process.exit(0) -} diff --git a/packages/wekan-request/tests/test-unix.js b/packages/wekan-request/tests/test-unix.js deleted file mode 100644 index 342905f7b..000000000 --- a/packages/wekan-request/tests/test-unix.js +++ /dev/null @@ -1,31 +0,0 @@ -var assert = require('assert') - , request = require('../index') - , http = require('http') - , fs = require('fs') - ; - -var path = [null, 'test', 'path'].join('/'); -var socket = [__dirname, 'tmp-socket'].join('/'); -var body = 'connected'; -var statusCode = 200; - -var s = http.createServer(function(req, res) { - // Assert requested path is sent to server - assert.equal(req.url, path); - res.statusCode = statusCode; - res.end(body); -}).listen(socket, function () { - - request(['unix://', socket, path].join(''), function (error, response, response_body) { - // Assert no error in connection - assert.equal(error, null); - // Assert http success status code - assert.equal(response.statusCode, statusCode); - // Assert expected response body is recieved - assert.equal(response_body, body); - // clean up - s.close(); - fs.unlink(socket, function(){}); - }) - -}) \ No newline at end of file diff --git a/packages/wekan-request/tests/unicycle.jpg b/packages/wekan-request/tests/unicycle.jpg deleted file mode 100644 index 7cea4dd71..000000000 Binary files a/packages/wekan-request/tests/unicycle.jpg and /dev/null differ diff --git a/public/api/wekan.html b/public/api/wekan.html index b7183b1a0..063b18baf 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.47 + Wekan REST API v5.85 @@ -1555,7 +1555,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    • - Wekan REST API v5.47 + Wekan REST API v5.85
    • @@ -2128,7 +2128,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
      -

      Wekan REST API v5.47

      +

      Wekan REST API v5.85

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

      @@ -3568,6 +3568,7 @@ System.out.println(response.toString()); "allowsEndDate": true, "allowsDueDate": true, "presentParentTask": "prefix-with-full-path", + "receivedAt": "string", "startAt": "string", "dueAt": "string", "endAt": "string", @@ -10426,6 +10427,7 @@ Accept: application/json "showOnCard": true, "automaticallyOnCard": true, "showLabelOnMiniCard": true, + "showSumAtTopOfList": true, "authorId": "string" }'; const headers = { @@ -10455,6 +10457,7 @@ fetch('/api/boards/{board}/custom-fields'"showOnCard": true, "automaticallyOnCard": true, "showLabelOnMiniCard": true, + "showSumAtTopOfList": true, "authorId": "string" }; const headers = { @@ -10581,6 +10584,7 @@ System.out.println(response.toString()); showOnCard: true automaticallyOnCard: true showLabelOnMiniCard: true +showSumAtTopOfList: true authorId: string @@ -10653,6 +10657,13 @@ System.out.println(response.toString()); should the label of the custom field be shown on minicards? +» showSumAtTopOfList +body +boolean +true +should the sum of the custom fields be shown at top of list? + + » authorId body string @@ -10983,7 +10994,8 @@ Accept: application/json "showOnCard": true, "automaticallyOnCard": true, "alwaysOnCard": "string", - "showLabelOnMiniCard": true + "showLabelOnMiniCard": true, + "showSumAtTopOfList": true }'; const headers = { 'Content-Type':'multipart/form-data', @@ -11012,7 +11024,8 @@ fetch('/api/boards/{board}/custom-fields/{customF "showOnCard": true, "automaticallyOnCard": true, "alwaysOnCard": "string", - "showLabelOnMiniCard": true + "showLabelOnMiniCard": true, + "showSumAtTopOfList": true }; const headers = { 'Content-Type':'multipart/form-data', @@ -11139,6 +11152,7 @@ System.out.println(response.toString()); automaticallyOnCard: true alwaysOnCard: string showLabelOnMiniCard: true +showSumAtTopOfList: true

      Parameters

      @@ -11223,6 +11237,13 @@ System.out.println(response.toString()); true should the label of the custom field be shown on minicards + +» showSumAtTopOfList +body +boolean +true +should the sum of the custom fields be shown at top of list +
      @@ -16029,6 +16050,7 @@ System.out.println(response.toString()); "showDesktopDragHandles": true, "hideCheckedItems": true, "cardMaximized": true, + "customFieldsGrid": true, "hiddenSystemMessages": true, "hiddenMinicardLabelText": true, "initials": "string", @@ -16782,6 +16804,7 @@ System.out.println(response.toString()); "showDesktopDragHandles": true, "hideCheckedItems": true, "cardMaximized": true, + "customFieldsGrid": true, "hiddenSystemMessages": true, "hiddenMinicardLabelText": true, "initials": "string", @@ -18362,6 +18385,7 @@ UserSecurity "allowsEndDate": true, "allowsDueDate": true, "presentParentTask": "prefix-with-full-path", + "receivedAt": "string", "startAt": "string", "dueAt": "string", "endAt": "string", @@ -18652,6 +18676,13 @@ UserSecurity 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 +receivedAt +string¦null +false +none +Date the card was received + + startAt string¦null false @@ -20109,6 +20140,7 @@ UserSecurity "automaticallyOnCard": true, "alwaysOnCard": true, "showLabelOnMiniCard": true, + "showSumAtTopOfList": true, "createdAt": "string", "modifiedAt": "string" } @@ -20184,6 +20216,13 @@ UserSecurity should the label of the custom field be shown on minicards? +showSumAtTopOfList +boolean +true +none +should the sum of the custom fields be shown at top of list? + + createdAt string¦null false @@ -20952,6 +20991,7 @@ UserSecurity "showDesktopDragHandles": true, "hideCheckedItems": true, "cardMaximized": true, + "customFieldsGrid": true, "hiddenSystemMessages": true, "hiddenMinicardLabelText": true, "initials": "string", @@ -21127,6 +21167,7 @@ UserSecurity "showDesktopDragHandles": true, "hideCheckedItems": true, "cardMaximized": true, + "customFieldsGrid": true, "hiddenSystemMessages": true, "hiddenMinicardLabelText": true, "initials": "string", @@ -21210,6 +21251,13 @@ UserSecurity has user clicked maximize card? +customFieldsGrid +boolean +false +none +has user at card Custom Fields have Grid (false) or one per row (true) layout? + + hiddenSystemMessages boolean false diff --git a/public/api/wekan.yml b/public/api/wekan.yml index 30685f50d..403b2db4a 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.47 + version: v5.85 description: | The REST API allows you to control and extend Wekan with ease. @@ -960,6 +960,12 @@ paths: should the label of the custom field be shown on minicards? type: boolean required: true + - name: showSumAtTopOfList + in: formData + description: | + should the sum of the custom fields be shown at top of list? + type: boolean + required: true - name: authorId in: formData description: the authorId value @@ -1068,6 +1074,12 @@ paths: should the label of the custom field be shown on minicards type: boolean required: true + - name: showSumAtTopOfList + in: formData + description: | + should the sum of the custom fields be shown at top of list + type: boolean + required: true - name: board in: path description: the board value @@ -2839,6 +2851,11 @@ definitions: - subtext-with-parent - no-parent x-nullable: true + receivedAt: + description: | + Date the card was received + type: string + x-nullable: true startAt: description: | Starting date of the board. @@ -3519,6 +3536,10 @@ definitions: description: | should the label of the custom field be shown on minicards? type: boolean + showSumAtTopOfList: + description: | + should the sum of the custom fields be shown at top of list? + type: boolean createdAt: type: string x-nullable: true @@ -3533,6 +3554,7 @@ definitions: - automaticallyOnCard - alwaysOnCard - showLabelOnMiniCard + - showSumAtTopOfList - modifiedAt CustomFieldsSettings: type: object @@ -3914,6 +3936,10 @@ definitions: description: | has user clicked maximize card? type: boolean + customFieldsGrid: + description: | + has user at card Custom Fields have Grid (false) or one per row (true) layout? + type: boolean hiddenSystemMessages: description: | does the user want to hide system messages? diff --git a/rebuild-wekan.bat b/rebuild-wekan.bat index 105abf970..d68e25bb8 100644 --- a/rebuild-wekan.bat +++ b/rebuild-wekan.bat @@ -16,21 +16,21 @@ cd C:\repos REM Install chocolatey @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin" -choco install -y git curl python2 dotnet4.5.2 nano mongodb-3 mongoclient meteor +choco install -y git curl python2 dotnet4.5.2 nano mongodb-4 mongoclient -curl -O https://nodejs.org/dist/v12.22.4/node-v12.22.4-x64.msi -call node-v12.22.4-x64.msi +curl -O https://nodejs.org/dist/v12.22.8/node-v12.22.8-x64.msi +call node-v12.22.8-x64.msi call npm config -g set msvs_version 2015 call meteor npm config -g set msvs_version 2015 call npm -g install npm +call npm -g install meteor call npm -g install node-gyp call npm -g install fibers cd C:\repos git clone https://github.com/wekan/wekan.git cd wekan -git checkout edge echo "Building Wekan." REM del /S /F /Q packages REM ## REPOS BELOW ARE INCLUDED TO WEKAN diff --git a/rebuild-wekan.sh b/rebuild-wekan.sh index 6c80753b4..9a198eeae 100755 --- a/rebuild-wekan.sh +++ b/rebuild-wekan.sh @@ -22,18 +22,18 @@ do if [[ "$OSTYPE" == "linux-gnu" ]]; then echo "Linux"; # Debian, Ubuntu, Mint - sudo apt-get install -y build-essential gcc g++ make git curl wget npm p7zip-full + sudo apt-get install -y build-essential gcc g++ make git curl wget p7zip-full zip unzip unp + curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash - + sudo apt-get install -y nodejs # npm nodejs #sudo npm -g install npm #curl -0 -L https://npmjs.org/install.sh | sudo sh #sudo chown -R $(id -u):$(id -g) $HOME/.npm - sudo npm -g install n - sudo n 12.22.4 - #curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - - #sudo apt-get install -y nodejs + #sudo npm -g install n + #sudo n 12.22.8 elif [[ "$OSTYPE" == "darwin"* ]]; then echo "macOS"; - pause '1) Install XCode 2) Install Node 8.x from https://nodejs.org/en/ 3) Press [Enter] key to continue.' + pause '1) Install XCode 2) Install Node 12.x from https://nodejs.org/en/ 3) Press [Enter] key to continue.' elif [[ "$OSTYPE" == "cygwin" ]]; then # POSIX compatibility layer and Linux environment emulation for Windows echo "TODO: Add Cygwin"; @@ -55,14 +55,15 @@ do exit; fi - ## Latest npm with Meteor 1.8.x + ## Latest npm with Meteor 2.2 sudo npm -g install npm sudo npm -g install node-gyp - # Latest fibers for Meteor 1.8.x + # Latest fibers for Meteor 2.2 sudo mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp sudo npm -g install fibers # Install Meteor, if it's not yet installed - curl https://install.meteor.com | bash + sudo npm install -g meteor --unsafe-perm + #curl https://install.meteor.com | bash #sudo chown -R $(id -u):$(id -g) $HOME/.npm $HOME/.meteor break ;; @@ -78,23 +79,21 @@ do #fi #cd .. #sudo chown -R $(id -u):$(id -g) $HOME/.npm $HOME/.meteor - cd ~/repos/wekan rm -rf node_modules .meteor/local .build chmod u+w *.json - npm install + meteor npm install meteor build .build --directory - rm -rf ~/repos/wekan/.build/bundle/programs/web.browser.legacy - cd ~/repos/wekan/.build/bundle/programs/server + rm -rf .build/bundle/programs/web.browser.legacy + pushd .build/bundle/programs/server rm -rf node_modules chmod u+w *.json - npm install + meteor npm install # Cleanup - cd ~/repos/wekan/.build/bundle + popd find . -type d -name '*-garbage*' | xargs rm -rf find . -name '*phantom*' | xargs rm -rf find . -name '.*.swp' | xargs rm -f find . -name '*.swp' | xargs rm -f - cd ~/repos/wekan # Add fibers multi arch #cd .build/bundle/programs/server/node_modules/fibers/bin #curl https://releases.wekan.team/fibers-multi.7z -o fibers-multi.7z diff --git a/releases/delete-phantomjs.sh b/releases/delete-phantomjs.sh deleted file mode 100755 index 5fb85e10c..000000000 --- a/releases/delete-phantomjs.sh +++ /dev/null @@ -1,3 +0,0 @@ -cd ~/repos/wekan/.build -find . -name "*phantomjs*" | xargs rm -rf -cd ~/repos/wekan diff --git a/releases/docker-build.sh b/releases/docker-build.sh new file mode 100755 index 000000000..0d076b5bc --- /dev/null +++ b/releases/docker-build.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Build Docker images locally, because builds at Quay.io and Docker Hub usually fail. +# +# To be done at ~/repos/wekan or ~/repos/w/wekan-gantt-gpl +# +# After building, you see created Docker image ID, that is then +# used with releases/docker-push-...sh scripts. + +docker build . diff --git a/releases/docker-push-gantt.sh b/releases/docker-push-gantt.sh new file mode 100755 index 000000000..80cb6927a --- /dev/null +++ b/releases/docker-push-gantt.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Push locally built docker images to Quay.io and Docker Hub. + +# Check that there is 2 parameters of +# of Wekan version number: + +if [ $# -ne 2 ] + then + echo "Usage: ./push-docker.sh DOCKERBUILDTAG WEKANVERSION" + echo "Example: ./push-docker.sh 12345 5.70" + exit 1 +fi + +docker tag $1 quay.io/wekan/wekan-gantt-gpl:v$2 +docker push quay.io/wekan/wekan-gantt-gpl:v$2 + +docker tag $1 quay.io/wekan/wekan-gantt-gpl:latest +docker push quay.io/wekan/wekan-gantt-gpl:latest + +docker tag $1 wekanteam/wekan-gantt-gpl:v$2 +docker push wekanteam/wekan-gantt-gpl:v$2 + +docker tag $1 wekanteam/wekan-gantt-gpl:latest +docker push wekanteam/wekan-gantt-gpl:latest diff --git a/releases/docker-push-wekan.sh b/releases/docker-push-wekan.sh new file mode 100755 index 000000000..4a30a95bc --- /dev/null +++ b/releases/docker-push-wekan.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Push locally built docker images to Quay.io and Docker Hub. + +# Check that there is 2 parameters of +# of Wekan version number: + +if [ $# -ne 2 ] + then + echo "Usage: ./push-docker.sh DOCKERBUILDTAG WEKANVERSION" + echo "Example: ./push-docker.sh 12345 5.70" + exit 1 +fi + +docker tag $1 quay.io/wekan/wekan:v$2 +docker push quay.io/wekan/wekan:v$2 + +docker tag $1 quay.io/wekan/wekan:latest +docker push quay.io/wekan/wekan:latest + +docker tag $1 wekanteam/wekan:v$2 +docker push wekanteam/wekan:v$2 + +docker tag $1 wekanteam/wekan:latest +docker push wekanteam/wekan:latest diff --git a/releases/maintainer-make-bundle-a.sh b/releases/maintainer-make-bundle-a.sh index 71ef923a5..e2c200fc3 100755 --- a/releases/maintainer-make-bundle-a.sh +++ b/releases/maintainer-make-bundle-a.sh @@ -10,36 +10,20 @@ if [ $# -ne 1 ] exit 1 fi -cd ~/repos +sudo apt -y install g++ build-essential +sudo npm -g install node-gyp rm -rf bundle - +#rm wekan-$1.zip +#wget https://releases.wekan.team/wekan-$1.zip unzip wekan-$1.zip - -sudo chown wekan:wekan bundle -R -sudo apt -y install libcurl4-openssl-dev - -sudo rm -f /home/wekan/repos/bundle/programs/server/node_modules/.bin/node-pre-gyp -sudo rm -f /home/wekan/repos/bundle/programs/server/node_modules/.bin/node-gyp -sudo rm -rf /home/wekan/repos/bundle/programs/server/npm/node_modules/meteor/lucasantoniassi_accounts-lockout/node_modules/.phantomjs-prebuilt-garbage-* -sudo rm -rf /home/wekan/repos/bundle/programs/server/node_modules/.bin/* -sudo rm -rf /home/wekan/repos/bundle/programs/server/node_modules/node-pre-gyp/node_modules/.bin/* -sudo rm -rf /home/wekan/repos/bundle/programs/server/node_modules/node-gyp/node_modules/.bin/* -sudo rm -rf /home/wekan/repos/bundle/programs/server/npm/node_modules/meteor/ostrio_files/node_modules/request-libcurl/.node_modules-garbage* - cd bundle/programs/server chmod u+w *.json -npm uninstall fibers node-gyp node-pre-gyp @mapbox/node-pre-gyp -npm install -npm install node-gyp -npm install @mapbox/node-pre-gyp -npm install fibers - -cd /home/wekan/repos/bundle +cd node_modules/fibers +node build.js +cd ../../../.. find . -type d -name '*-garbage*' | xargs rm -rf find . -name '*phantom*' | xargs rm -rf find . -name '.*.swp' | xargs rm -f find . -name '*.swp' | xargs rm -f - -cd /home/wekan/repos - +cd .. zip -r wekan-$1-arm64.zip bundle diff --git a/releases/maintainer-make-bundle-o.sh b/releases/maintainer-make-bundle-o.sh index 51004dc4f..db1f310fb 100755 --- a/releases/maintainer-make-bundle-o.sh +++ b/releases/maintainer-make-bundle-o.sh @@ -3,9 +3,6 @@ # 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:" @@ -13,19 +10,17 @@ if [ $# -ne 1 ] exit 1 fi -# 2) Build bundle - -cd /home/ubuntu +sudo apt -y install g++ build-essential +sudo npm -g install node-gyp rm -rf bundle +#rm wekan-$1.zip #wget https://releases.wekan.team/wekan-$1.zip unzip wekan-$1.zip -cd /home/ubuntu/bundle/programs/server +cd bundle/programs/server chmod u+w *.json -cd /home/ubuntu/bundle/programs/server/node_modules/fibers +cd 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/ -cd bundle +cd ../../../.. find . -type d -name '*-garbage*' | xargs rm -rf find . -name '*phantom*' | xargs rm -rf find . -name '.*.swp' | xargs rm -f diff --git a/releases/maintainer-make-bundle-s.sh b/releases/maintainer-make-bundle-s.sh index eae1f82f3..490c28cec 100755 --- a/releases/maintainer-make-bundle-s.sh +++ b/releases/maintainer-make-bundle-s.sh @@ -10,16 +10,16 @@ if [ $# -ne 1 ] exit 1 fi -cd /home/linux1 +sudo npm -g install node-gyp rm -rf bundle +#rm wekan-$1.zip +#wget https://releases.wekan.team/wekan-$1.zip unzip wekan-$1.zip -cd /home/linux1/bundle/programs/server +cd bundle/programs/server chmod u+w *.json -cd /home/linux1/bundle/programs/server/node_modules/fibers +cd node_modules/fibers node build.js -cd /home/linux1 -#cp -pR /home/linux1/node-fibers/bin/linux-s390x-83-glibc bundle/programs/server/node_modules/fibers/bin/ -cd bundle +cd ../../../.. find . -type d -name '*-garbage*' | xargs rm -rf find . -name '*phantom*' | xargs rm -rf find . -name '.*.swp' | xargs rm -f diff --git a/releases/npm-publish.sh b/releases/npm-publish.sh new file mode 100755 index 000000000..4face7b15 --- /dev/null +++ b/releases/npm-publish.sh @@ -0,0 +1,5 @@ +# For npmjs.com packages where xet7 added updated dependencies: +# @wekanteam/markdown-it-mermaid +# @wekanteam/cli-table3 + +npm publish --access public diff --git a/releases/translations/pull-translations.sh b/releases/translations/pull-translations.sh index 82c05c7c6..4c64748f0 100755 --- a/releases/translations/pull-translations.sh +++ b/releases/translations/pull-translations.sh @@ -27,6 +27,9 @@ tx pull -f -l zh_CN echo "Chinese (Hong Kong):" tx pull -f -l zh_HK +echo "Chinese Simplified (zh-Hans):" +tx pull -f -l zh_Hans + echo "Chinese (Taiwan):" tx pull -f -l zh_TW @@ -45,6 +48,9 @@ tx pull -f -l nl echo "Esperanto:" tx pull -f -l eo +echo "English (Germany):" +tx pull -f -l en_DE + echo "English (Italy):" tx pull -f -l en_IT @@ -57,6 +63,9 @@ tx pull -f -l fi echo "French:" tx pull -f -l fr +echo "French (Switzerland):" +tx pull -f -l fr_CH + echo "Galician:" tx pull -f -l gl @@ -66,11 +75,20 @@ tx pull -f -l ka echo "German:" tx pull -f -l de +echo "German (Austria):" +tx pull -f -l de_AT + echo "German (Switzerland) => Deutsch (Schweiz):" tx pull -f -l de_CH -echo "Greek:" -tx pull -f -l el +#echo "Greek:" +#tx pull -f -l el + +echo "Greek (Greece):" +tx pull -f -l el_GR + +echo "Gurajati (India):" +tx pull -f -l gu_IN echo "Hebrew:" tx pull -f -l he @@ -81,6 +99,12 @@ tx pull -f -l hu_HU echo "Hindi:" tx pull -f -l hi +echo "Hindi (India)": +tx pull -f -l hi_IN + +echo "Khmer (km)": +tx pull -f -l km + echo "Lithuanian:" tx pull -f -l lt @@ -114,6 +138,9 @@ tx pull -f -l lv_LV echo "Macedonian:" tx pull -f -l mk +echo "Malay (Malaysia) (ms_MY):" +tx pull -f -l ms_MY + echo "Mongolian (Mongolia):" tx pull -f -l mn_MN diff --git a/releases/virtualbox/start-wekan.sh b/releases/virtualbox/start-wekan.sh index 9ee48e671..28c703d0a 100755 --- a/releases/virtualbox/start-wekan.sh +++ b/releases/virtualbox/start-wekan.sh @@ -16,6 +16,10 @@ # https://github.com/wekan/wekan/wiki/Troubleshooting-Mail # https://github.com/wekan/wekan-mongodb/blob/master/docker-compose.yml export MAIL_URL='smtp://user:pass@mailserver.example.com:25/' + export MAIL_FROM='Wekan Boards ' + #export MAIL_SERVICE=Outlook365 + #export MAIL_SERVICE_USER=firstname.lastname@hotmail.com + #export MAIL_SERVICE_PASSWORD=SecretPassword #--------------------------------------------- #export KADIRA_OPTIONS_ENDPOINT=http://127.0.0.1:11011 #--------------------------------------------- @@ -39,6 +43,11 @@ #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 #--------------------------------------------------------------- + # ==== ACCOUNT OPTIONS ==== + # https://docs.meteor.com/api/accounts-multi.html#AccountsCommon-config + # Defaults below. Uncomment to change. wekan/server/accounts-common.js + # - ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 + #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 export RICHER_CARD_COMMENT_EDITOR=false diff --git a/sandstorm-pkgdef.capnp b/sandstorm-pkgdef.capnp index 1fec033c6..296231b50 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 = 547, + appVersion = 585, # Increment this for every release. - appMarketingVersion = (defaultText = "5.47.0~2021-08-05"), + appMarketingVersion = (defaultText = "5.85.0~2021-12-17"), # Human-readable presentation of the app version. minUpgradableAppVersion = 0, diff --git a/server/accounts-common.js b/server/accounts-common.js new file mode 100644 index 000000000..4a7947a60 --- /dev/null +++ b/server/accounts-common.js @@ -0,0 +1,9 @@ +Meteor.startup(() => { + if (Meteor.isServer) { + import { AccountsCommon } from 'meteor/accounts-base'; + + Accounts.config({ + loginExpirationInDays: process.env.ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS || 90, + }); + } +}); diff --git a/server/migrations.js b/server/migrations.js index d50fb7919..7d2badf8c 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -1,4 +1,5 @@ import AccountSettings from '../models/accountSettings'; +import TableVisibilityModeSettings from '../models/tableVisibilityModeSettings'; import Actions from '../models/actions'; import Activities from '../models/activities'; import Announcements from '../models/announcements'; @@ -645,6 +646,7 @@ Migrations.add('mutate-boardIds-in-customfields', () => { const modifiedAtTables = [ AccountSettings, + TableVisibilityModeSettings, Actions, Activities, Announcements, @@ -699,6 +701,7 @@ Migrations.add('add-missing-created-and-modified', () => { Migrations.add('fix-incorrect-dates', () => { const tables = [ AccountSettings, + TableVisibilityModeSettings, Actions, Activities, Announcements, diff --git a/server/notifications/email.js b/server/notifications/email.js index acafb4dee..b696aa90b 100644 --- a/server/notifications/email.js +++ b/server/notifications/email.js @@ -1,3 +1,5 @@ +//var nodemailer = require('nodemailer'); + // buffer each user's email text in a queue, then flush them in single email Meteor.startup(() => { Notifications.subscribe('email', (user, title, description, params) => { @@ -38,6 +40,30 @@ Meteor.startup(() => { const html = texts.join('
      \n\n'); user.clearEmailBuffer(); try { +/* + if (process.env.MAIL_SERVICE !== '') { + let transporter = nodemailer.createTransport({ + service: process.env.MAIL_SERVICE, + auth: { + user: process.env.MAIL_SERVICE_USER, + pass: process.env.MAIL_SERVICE_PASSWORD + }, + }) + let info = transporter.sendMail({ + to: user.emails[0].address.toLowerCase(), + from: Accounts.emailTemplates.from, + subject, + html, + }) + } else { + Email.send({ + to: user.emails[0].address.toLowerCase(), + from: Accounts.emailTemplates.from, + subject, + html, + }); + } +*/ Email.send({ to: user.emails[0].address.toLowerCase(), from: Accounts.emailTemplates.from, diff --git a/server/publications/attachments.js b/server/publications/attachments.js index 80ef954cc..18566f7da 100644 --- a/server/publications/attachments.js +++ b/server/publications/attachments.js @@ -34,27 +34,32 @@ Meteor.publish('attachmentsList', function() { Meteor.publish('orphanedAttachments', function() { let keys = []; - Attachments.find({}, { fields: { copies: 1 } }).forEach(att => { - keys.push(new ObjectID(att.copies.attachments.key)); - }); - keys.sort(); - keys = _.uniq(keys, true); - return AttachmentStorage.find( - { _id: { $nin: keys } }, - { - fields: { - _id: 1, - filename: 1, - md5: 1, - length: 1, - contentType: 1, - metadata: 1, + if (Attachments.find({}, { fields: { copies: 1 } }) !== undefined) { + Attachments.find({}, { fields: { copies: 1 } }).forEach(att => { + keys.push(new ObjectID(att.copies.attachments.key)); + }); + keys.sort(); + keys = _.uniq(keys, true); + + return AttachmentStorage.find( + { _id: { $nin: keys } }, + { + fields: { + _id: 1, + filename: 1, + md5: 1, + length: 1, + contentType: 1, + metadata: 1, + }, + sort: { + filename: 1, + }, + limit: 250, }, - sort: { - filename: 1, - }, - limit: 250, - }, - ); + ); + } else { + return []; + } }); diff --git a/server/publications/boards.js b/server/publications/boards.js index 12a30e317..23306e087 100644 --- a/server/publications/boards.js +++ b/server/publications/boards.js @@ -129,6 +129,7 @@ Meteor.publishRelations('board', function(boardId, isArchived) { this.cursor(Lists.find({ boardId, archived: isArchived })); this.cursor(Swimlanes.find({ boardId, archived: isArchived })); this.cursor(Integrations.find({ boardId })); + this.cursor(CardCommentReactions.find({ boardId })); this.cursor( CustomFields.find( { boardIds: { $in: [boardId] } }, @@ -161,6 +162,8 @@ Meteor.publishRelations('board', function(boardId, isArchived) { // Gather queries and send in bulk const cardComments = this.join(CardComments); cardComments.selector = _ids => ({ cardId: _ids }); + const cardCommentReactions = this.join(CardCommentReactions); + cardCommentReactions.selector = _ids => ({ cardId: _ids }); const attachments = this.join(Attachments); attachments.selector = _ids => ({ cardId: _ids }); const checklists = this.join(Checklists); @@ -194,12 +197,14 @@ Meteor.publishRelations('board', function(boardId, isArchived) { checklists.push(cardId); checklistItems.push(cardId); parentCards.push(cardId); + cardCommentReactions.push(cardId) }, ); // Send bulk queries for all found ids subCards.send(); cardComments.send(); + cardCommentReactions.send(); attachments.send(); checklists.send(); checklistItems.send(); diff --git a/server/publications/cards.js b/server/publications/cards.js index 325b64965..021e0b1df 100644 --- a/server/publications/cards.js +++ b/server/publications/cards.js @@ -53,7 +53,22 @@ const escapeForRegex = require('escape-string-regexp'); Meteor.publish('card', cardId => { check(cardId, String); - return Cards.find({ _id: cardId }); + const ret = Cards.find({ _id: cardId }); + return ret; +}); + +/** publish all data which is necessary to display card details as popup + * @returns array of cursors + */ +Meteor.publishRelations('popupCardData', function(cardId) { + check(cardId, String); + this.cursor( + Cards.find({_id: cardId}), + function(cardId, card) { + this.cursor(Boards.find({_id: card.boardId})); + }, + ); + return this.ready() }); Meteor.publish('myCards', function(sessionId) { @@ -113,7 +128,7 @@ function buildSelector(queryParams) { let selector = {}; // eslint-disable-next-line no-console - console.log('queryParams:', queryParams); + // console.log('queryParams:', queryParams); if (queryParams.selector) { selector = queryParams.selector; @@ -405,7 +420,7 @@ function buildSelector(queryParams) { const items = ChecklistItems.find( { title: regex }, - { fields: { cardId: 1 } }, + { fields: { cardId: 1, checklistId: 1 } }, ); const checklists = Checklists.find( { @@ -424,23 +439,18 @@ function buildSelector(queryParams) { { fields: { cardId: 1 } }, ); - selector.$and.push({ - $or: [ + let cardsSelector = [ { title: regex }, { description: regex }, { customFields: { $elemMatch: { value: regex } } }, - // { - // _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) } }, - ], - }); + ]; + if (queryParams.text == "false" || queryParams.text == "true") { + cardsSelector.push({ customFields: { $elemMatch: { value: queryParams.text == "true" ? true : false } } } ); + } + selector.$and.push({ $or: cardsSelector }); } if (selector.$and.length === 0) { @@ -449,9 +459,7 @@ function buildSelector(queryParams) { } // eslint-disable-next-line no-console - console.log('selector:', selector); - // eslint-disable-next-line no-console - console.log('selector.$and:', selector.$and); + //console.log('cards selector:', JSON.stringify(selector, null, 2)); const query = new Query(); query.selector = selector; @@ -497,6 +505,7 @@ function buildProjection(query) { labelIds: 1, customFields: 1, userId: 1, + description: 1, }, sort: { boardId: 1, @@ -612,7 +621,7 @@ function findCards(sessionId, query) { // console.log('selector:', query.selector); // console.log('selector.$and:', query.selector.$and); // eslint-disable-next-line no-console - // console.log('projection:', projection); + // console.log('projection:', query.projection); const cards = Cards.find(query.selector, query.projection); // eslint-disable-next-line no-console @@ -715,6 +724,7 @@ function findCards(sessionId, query) { CustomFields.find({ _id: { $in: customFieldIds } }), Users.find({ _id: { $in: users } }, { fields: Users.safeFields }), Checklists.find({ cardId: { $in: cards.map(c => c._id) } }), + ChecklistItems.find({ cardId: { $in: cards.map(c => c._id) } }), Attachments.find({ cardId: { $in: cards.map(c => c._id) } }), CardComments.find({ cardId: { $in: cards.map(c => c._id) } }), SessionData.find({ userId, sessionId }), diff --git a/server/publications/settings.js b/server/publications/settings.js index 84234e31b..f7ee33f32 100644 --- a/server/publications/settings.js +++ b/server/publications/settings.js @@ -24,6 +24,9 @@ Meteor.publish('setting', () => { displayAuthenticationMethod: 1, defaultAuthenticationMethod: 1, spinnerName: 1, + oidcBtnText: 1, + mailDomainName: 1, + legalNotice: 1, }, }, ); diff --git a/server/publications/tableVisibilityModeSettings.js b/server/publications/tableVisibilityModeSettings.js new file mode 100644 index 000000000..0fa7dc401 --- /dev/null +++ b/server/publications/tableVisibilityModeSettings.js @@ -0,0 +1,3 @@ +Meteor.publish('tableVisibilityModeSettings', function() { + return TableVisibilityModeSettings.find(); +}); diff --git a/server/publications/users.js b/server/publications/users.js index fd6147d13..df50f7be8 100644 --- a/server/publications/users.js +++ b/server/publications/users.js @@ -25,6 +25,7 @@ Meteor.publish('user-admin', function() { isAdmin: 1, teams: 1, orgs: 1, + authenticationMethod: 1, }, }); }); diff --git a/server/rulesHelper.js b/server/rulesHelper.js index e2f577826..1d3df2090 100644 --- a/server/rulesHelper.js +++ b/server/rulesHelper.js @@ -1,3 +1,5 @@ +//var nodemailer = require('nodemailer'); + RulesHelper = { executeRules(activity) { const matchingRules = this.findMatchingRules(activity); @@ -45,8 +47,12 @@ RulesHelper = { value = oldSwimlane.title; } } + let matchesList = [value, '*']; + if ((field === 'cardTitle') && (value !== undefined)) { + matchesList = value.split(/\W/).concat(matchesList); + } matchingMap[field] = { - $in: [value, '*'], + $in: matchesList, }; }); return matchingMap; @@ -119,6 +125,30 @@ RulesHelper = { const text = action.emailMsg || ''; const subject = action.emailSubject || ''; try { +/* + if (process.env.MAIL_SERVICE !== '') { + let transporter = nodemailer.createTransport({ + service: process.env.MAIL_SERVICE, + auth: { + user: process.env.MAIL_SERVICE_USER, + pass: process.env.MAIL_SERVICE_PASSWORD + }, + }) + let info = transporter.sendMail({ + to, + from: Accounts.emailTemplates.from, + subject, + text, + }) + } else { + Email.send({ + to, + from: Accounts.emailTemplates.from, + subject, + text, + }); + } +*/ Email.send({ to, from: Accounts.emailTemplates.from, diff --git a/server/statistics.js b/server/statistics.js index 0ead840f4..d0a0855e2 100644 --- a/server/statistics.js +++ b/server/statistics.js @@ -1,5 +1,10 @@ import { MongoInternals } from 'meteor/mongo'; +// Sandstorm context is detected using the METEOR_SETTINGS environment variable +// in the package definition. +const isSandstorm = + Meteor.settings && Meteor.settings.public && Meteor.settings.public.sandstorm; + if (Meteor.isServer) { Meteor.methods({ getStatistics() { @@ -28,6 +33,35 @@ if (Meteor.isServer) { pid: process.pid, uptime: process.uptime(), }; + // Start: Show Nodejs heap stats at Standalone WeKan. + // + // Not shown at Sandstorm WeKan, because there's a bunch of machine performance data + // Sandstorm doesn't expose to apps to prevent side channel attacks. + if (!isSandstorm) { + const v8 = require('v8'); // Import the v8 module + statistics.nodeHeapStats = { + totalHeapSize: v8.getHeapStatistics().total_heap_size, + totalHeapSizeExecutable: v8.getHeapStatistics().total_heap_size_executable, + totalPhysicalSize: v8.getHeapStatistics().total_physical_size, + totalAvailableSize: v8.getHeapStatistics().total_available_size, + usedHeapSize: v8.getHeapStatistics().used_heap_size, + heapSizeLimit: v8.getHeapStatistics().heap_size_limit, + mallocedMemory: v8.getHeapStatistics().malloced_memory, + peakMallocedMemory: v8.getHeapStatistics().peak_malloced_memory, + doesZapGarbage: v8.getHeapStatistics().does_zap_garbage, + numberOfNativeContexts: v8.getHeapStatistics().number_of_native_contexts, + numberOfDetachedContexts: v8.getHeapStatistics().number_of_detached_contexts, + }; + let memoryUsage = process.memoryUsage(); + statistics.nodeMemoryUsage = { + rss: memoryUsage.rss, + heapTotal: memoryUsage.heapTotal, + heapUsed: memoryUsage.heapUsed, + external: memoryUsage.external, + }; + } + // End: Show Nodejs heap stats at Standalone WeKan. + // // Remove beginning of Meteor release text METEOR@ let meteorVersion = Meteor.release; meteorVersion = meteorVersion.replace('METEOR@', ''); diff --git a/snap-src/bin/config b/snap-src/bin/config index b1f56e61a..6b1d0f583 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_AD_SIMPLE_AUTH 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 WAIT_SPINNER" +keys="DEBUG MONGO_LOG_DESTINATION MONGO_URL MONGODB_BIND_UNIX_SOCKET MONGO_URL MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM MAIL_SERVICE MAIL_SERVICE_USER MAIL_SERVICE_PASSWORD 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 ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS 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_AD_SIMPLE_AUTH 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 WAIT_SPINNER" # default values DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'" @@ -33,13 +33,25 @@ DEFAULT_MONGODB_BIND_IP="127.0.0.1" KEY_MONGODB_BIND_IP="mongodb-bind-ip" DESCRIPTION_MAIL_URL="wekan mail binding" -DEFAULT_MAIL_URL="smtp://user:pass@mailserver.examples.com:25/" +DEFAULT_MAIL_URL="" KEY_MAIL_URL="mail-url" DESCRIPTION_MAIL_FROM="wekan's admin mail from name email address" -DEFAULT_MAIL_FROM="wekan-admin@example.com" +DEFAULT_MAIL_FROM="" KEY_MAIL_FROM="mail-from" +DESCRIPTION_MAIL_SERVICE="wekan's mail-service, see https://github.com/wekan/wekan/wiki/Troubleshooting-Mail" +DEFAULT_MAIL_SERVICE="" +KEY_MAIL_SERVICE="mail-service" + +DESCRIPTION_MAIL_SERVICE_USER="wekan's mail-service-user" +DEFAULT_MAIL_SERVICE_USER="" +KEY_MAIL_SERVICE_USER="mail-service-user" + +DESCRIPTION_MAIL_SERVICE_PASSWORD="wekan's mail-service-password" +DEFAULT_MAIL_SERVICE_PASSWORD="" +KEY_MAIL_SERVICE_PASSWORD="mail-service-password" + DESCRIPTION_ROOT_URL="wekan's root url, eg http://127.0.0.1, https://example.com, https://wekan.example.com, http://example.com/wekan" DEFAULT_ROOT_URL="http://127.0.0.1" KEY_ROOT_URL="root-url" @@ -96,6 +108,10 @@ DESCRIPTION_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW="Accounts lockout unkn DEFAULT_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW="15" KEY_ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW="accounts-lockout-unknown-users-failure-window" +DESCRIPTION_ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS="Accounts common login expiration in days. Default: 90" +DEFAULT_ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS="90" +KEY_ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS="accounts-common-login-expiration-in-days" + DESCRIPTION_ATTACHMENTS_STORE_PATH="Allow wekan ower to specify where uploaded files to store on the server instead of the mongodb" DEFAULT_ATTACHMENTS_STORE_PATH="" KEY_ATTACHMENTS_STORE_PATH="attachments-store-path" diff --git a/snap-src/bin/wekan-help b/snap-src/bin/wekan-help index 574a6a434..2a2fc717a 100755 --- a/snap-src/bin/wekan-help +++ b/snap-src/bin/wekan-help @@ -49,6 +49,18 @@ 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 "Email: https://github.com/wekan/wekan/wiki/Troubleshooting-Mail" +echo -e "mail-url:" +echo -e "\t$ snap set $SNAP_NAME mail-url='smtp://username:password@email-smtp.eu-west-1.amazonaws.com:587?tls={ciphers:\"SSLv3\"}&secureConnection=false'" +echo -e "mail-from:" +echo -e "\t$ snap set $SNAP_NAME mail-from='Boards Support '" +echo -e "mail-service (CURRENTLY NOT IN USE):" +echo -e "\t$ snap set $SNAP_NAME mail-service='Outlook365'" +echo -e "mail-service-user:" +echo -e "\t$ snap set $SNAP_NAME mail-service-user='firstname.lastname@hotmail.com'" +echo -e "mail-service-password:" +echo -e "\t$ snap set $SNAP_NAME mail-service-password='SecretPassword'" +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:" @@ -84,6 +96,11 @@ echo -e "\t$ snap set $SNAP_NAME accounts-lockout-unknown-users-failure-window=' echo -e "\t-Restore default:" echo -e "\t$ snap unset $SNAP_NAME accounts-lockout-unknown-users-failure-window" echo -e "\n" +echo -e "Accounts common login expiration in days. Default: 90" +echo -e "\t$ snap set $SNAP_NAME accounts-common-login-expiration-in-days='90'" +echo -e "\t-Restore default:" +echo -e "\t$ snap unset $SNAP_NAME accounts-common-login-expiration-in-days" +echo -e "\n" echo -e "Rich text editor in card comments. Default: false https://github.com/wekan/wekan/pull/2560" echo -e "Enable:" echo -e "\t$ snap set $SNAP_NAME richer-card-comment-editor='true'" diff --git a/snapcraft.yaml b/snapcraft.yaml index d5f5943bd..47a77f4c1 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -1,8 +1,8 @@ name: wekan -version: '5.47' -summary: The open-source kanban +version: '5.85' +summary: Open Source kanban description: | - Wekan is an open-source and collaborative kanban board application. + WeKan ® is an Open Source and collaborative kanban board application. Whether you’re maintaining a personal todo list, planning your holidays with some friends, or working in a team on your next revolutionary idea, Kanban boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most. Depending on target environment, some configuration settings might need to be adjusted. @@ -80,7 +80,7 @@ parts: wekan: source: . plugin: nodejs - node-engine: 12.22.4 + node-engine: 12.22.8 node-packages: - node-gyp - node-pre-gyp diff --git a/stacksmith/user-scripts/build.sh b/stacksmith/user-scripts/build.sh index 6583cecbb..dd863c442 100755 --- a/stacksmith/user-scripts/build.sh +++ b/stacksmith/user-scripts/build.sh @@ -2,7 +2,7 @@ set -euxo pipefail BUILD_DEPS="bsdtar gnupg wget curl bzip2 python git ca-certificates perl-Digest-SHA" -NODE_VERSION=v12.22.4 +NODE_VERSION=v12.22.8 #METEOR_RELEASE=1.6.0.1 - for Stacksmith, meteor-1.8 branch that could have METEOR@1.8.1-beta.8 or newer USE_EDGE=false METEOR_EDGE=1.5-beta.17 diff --git a/start-wekan.bat b/start-wekan.bat index 0d7cf9f98..7f6725cc2 100644 --- a/start-wekan.bat +++ b/start-wekan.bat @@ -14,6 +14,11 @@ SET MONGO_URL=mongodb://127.0.0.1:27017/wekan 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 # Currently MAIL_SERVICE is not in use. +REM SET MAIL_SERVICE=Outlook365 +REM SET MAIL_SERVICE_USER=firstname.lastname@hotmail.com +REM SET MAIL_SERVICE_PASSWORD=SecretPassword + REM # ==== NUMBER OF SEARCH RESULTS PER PAGE BY DEFAULT ==== REM SET RESULTS_PER_PAGE=20 @@ -43,6 +48,9 @@ REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURES_BERORE=3 REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 REM SET ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 +REM # ==== ACCOUNT OPTIONS ==== +REM SET ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 + REM # ==== NOTIFICATION TRAY AFTER READ DAYS BEFORE REMOVE ===== REM # Number of days after a notification is read before we remove it. REM # Default: 2 diff --git a/start-wekan.sh b/start-wekan.sh index d5f933f9c..18626b9d0 100755 --- a/start-wekan.sh +++ b/start-wekan.sh @@ -17,6 +17,11 @@ # https://github.com/wekan/wekan/wiki/Troubleshooting-Mail # https://github.com/wekan/wekan-mongodb/blob/master/docker-compose.yml export MAIL_URL='smtp://user:pass@mailserver.example.com:25/' + export MAIL_FROM='Wekan Boards ' + # Currently MAIL_SERVICE is not in use. + #export MAIL_SERVICE=Outlook365 + #export MAIL_SERVICE_USER=firstname.lastname@hotmail.com + #export MAIL_SERVICE_PASSWORD=SecretPassword #--------------------------------------------- #export KADIRA_OPTIONS_ENDPOINT=http://127.0.0.1:11011 #--------------------------------------------- @@ -40,6 +45,11 @@ #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 #export ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 #--------------------------------------------------------------- + # ==== ACCOUNT OPTIONS ==== + # https://docs.meteor.com/api/accounts-multi.html#AccountsCommon-config + # Defaults below. Uncomment to change. wekan/server/accounts-common.js + # - ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 + #--------------------------------------------------------------- # ==== RICH TEXT EDITOR IN CARD COMMENTS ==== # https://github.com/wekan/wekan/pull/2560 export RICHER_CARD_COMMENT_EDITOR=false diff --git a/torodb-postgresql/docker-compose.yml b/torodb-postgresql/docker-compose.yml index 1a627df6c..7d1ce3754 100644 --- a/torodb-postgresql/docker-compose.yml +++ b/torodb-postgresql/docker-compose.yml @@ -108,6 +108,8 @@ services: - TORODB_BACKEND_USER=wekan - TORODB_BACKEND_PASSWORD=wekan - DEBUG + volumes: + - /etc/localtime:/etc/localtime:ro postgres: image: quay.io/wekan/postgres:9.6 networks: @@ -116,6 +118,8 @@ services: - POSTGRES_PASSWORD=wekan ports: - "5432:5432" + volumes: + - /etc/localtime:/etc/localtime:ro mongodb: image: mongo:3.2 networks: @@ -136,6 +140,8 @@ services: rs.initiate({_id:"rs1",members:[{_id:0,host:"mongodb:27017"}]}); ' 1>/dev/null 2>&1 & mongod --replSet rs1 + volumes: + - /etc/localtime:/etc/localtime:ro wekan: image: quay.io/wekan/wekan container_name: wekan-app @@ -163,13 +169,18 @@ services: # - http://192.168.1.100 <=== using at local LAN - ROOT_URL=http://localhost # <=== using only at same laptop/desktop where Wekan is installed # ==== EMAIL SETTINGS ==== - # Email settings are required in both MAIL_URL and Admin Panel, + # Email settings are only at MAIL_URL and MAIL_FROM. + # Admin Panel has test button, but it's not used for settings. # see https://github.com/wekan/wekan/wiki/Troubleshooting-Mail # For SSL in email, change smtp:// to smtps:// # NOTE: Special characters need to be url-encoded in MAIL_URL. # You can encode those characters for example at: https://www.urlencoder.org - MAIL_URL=smtp://user:pass@mailserver.example.com:25/ - MAIL_FROM='Example Wekan Support ' + # Currently MAIL_SERVICE is not in use. + #- MAIL_SERVICE=Outlook365 + #- MAIL_SERVICE_USER=firstname.lastname@hotmail.com + #- MAIL_SERVICE_PASSWORD=SecretPassword #--------------------------------------------------------------- # ==== OPTIONAL: MONGO OPLOG SETTINGS ===== # https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-378343587 @@ -230,6 +241,11 @@ services: #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 #- ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 #--------------------------------------------------------------- + # ==== ACCOUNT OPTIONS ==== + # https://docs.meteor.com/api/accounts-multi.html#AccountsCommon-config + # Defaults below. Uncomment to change. wekan/server/accounts-common.js + # - ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 + #--------------------------------------------------------------- # ==== STORE ATTACHMENT ON SERVER FILESYSTEM INSTEAD OF MONGODB ==== # https://github.com/wekan/wekan/pull/2603 #- ATTACHMENTS_STORE_PATH = # pathname can be relative or fullpath @@ -599,6 +615,8 @@ services: depends_on: - mongodb + volumes: + - /etc/localtime:/etc/localtime:ro #--------------------------------------------------------------------------------- # ==== OPTIONAL: SHARE DATABASE TO OFFICE LAN AND REMOTE VPN ====