Compare commits

...
189 Commits
Author SHA1 Message Date
Lauri Ojansivu 5d5605754c v6.10 2022-03-02 21:31:42 +02:00
Lauri Ojansivu 9b4179e163 Updated dependencies. 2022-03-02 21:23:59 +02:00
Lauri Ojansivu ab33866d1a Use Node 14 at rebuild-wekan.sh
Thanks to xet7 !
2022-03-02 20:50:42 +02:00
Lauri Ojansivu 41ba67538b Updated ChangeLog. 2022-03-02 20:20:38 +02:00
Lauri Ojansivu e0d8ddf003 Added WRITABLE_PATH to be usable when developing with meteor command, and to torodb.
Thanks to xet7 !
2022-03-02 20:18:22 +02:00
Lauri Ojansivu 1a7a41698c Updated dependencies.
Thanks to developers of dependencies !
2022-03-02 20:16:30 +02:00
Lauri Ojansivu 2b999d2836 Updated ChangeLog. 2022-03-02 19:47:00 +02:00
Lauri Ojansivu dc99218e4e Enabled building Sandstorm WeKan, now that file uploading with Meteor-Files works.
Thanks to imajus, mfilser and xet7 !
2022-03-02 19:44:57 +02:00
Lauri Ojansivu bec440360a Merge branch 'feature-meteor-files' of github.com:wekan/wekan into feature-meteor-files 2022-03-02 17:34:20 +02:00
Lauri Ojansivu cc0658a225 Added Meteor-Files WRITEABLE_PATH for Sandstorm, Snap and Source.
Thanks to xet7 !

Related export WRITABLE_PATH=$SNAP_COMMON/wekan-uploads/
2022-03-02 17:33:14 +02:00
Lauri Ojansivu 00b99cda73 Added Meteor-Files WRITEABLE_PATH for Sandstorm, Snap and Source.
Thanks to xet7 !
2022-03-02 17:32:34 +02:00
Lauri Ojansivu b378bb55ac Merge remote-tracking branch 'remotes/origin/master' into feature-meteor-files 2022-03-01 21:09:55 +02:00
Lauri Ojansivu 7d5eac6876 Updated translations. 2022-03-01 20:42:59 +02:00
Lauri Ojansivu 4d539f369a Updated translations. 2022-02-28 17:02:55 +02:00
Lauri Ojansivu 5dadb4f0a1 v6.09 2022-02-28 01:46:57 +02:00
Lauri Ojansivu 1629e6aae6 Updated ChangeLog. 2022-02-28 01:40:52 +02:00
Lauri Ojansivu 0775e2a3e5 Try to fix Admin Panel / Disable Registration and Disable Forgot Password.
Thanks to urmel1960, Ben0it-T and xet7 !

Fixes #4384
2022-02-28 01:34:57 +02:00
Lauri Ojansivu 454d0b270d v6.08 2022-02-27 23:19:29 +02:00
Lauri Ojansivu 3076547cee Try to allow register and login.
Thanks to xet7 !

Related #4383
2022-02-27 23:13:20 +02:00
Lauri Ojansivu 4bcddcc98a Updated translations. 2022-02-26 19:26:51 +02:00
Lauri Ojansivu 099085b416 v6.07 2022-02-26 04:20:53 +02:00
Lauri Ojansivu 9bd6879455 Fix Forgot Password to be optional.
Thanks to xet7 !
2022-02-26 04:16:16 +02:00
Lauri Ojansivu 00efbf00d3 v6.06 2022-02-26 04:03:32 +02:00
Lauri Ojansivu 5c214c143d Updated translations. 2022-02-26 03:59:33 +02:00
Lauri Ojansivu 3418b97faa Updated translations. 2022-02-26 02:02:32 +02:00
Lauri Ojansivu a484101abf Updated ChangeLog. 2022-02-26 01:47:14 +02:00
Lauri Ojansivu 2f79432e4e Merge pull request #4379 from Viehlieb/feature/propagate_oidc_data
Feature/propagate OIDC data
2022-02-26 01:43:25 +02:00
Lauri Ojansivu f71728ae16 Merge pull request #4377 from Viehlieb/feature/shortcuts_for_label_assignment
Feature/shortcuts for label assignment
2022-02-26 01:37:09 +02:00
Lauri Ojansivu e7e4296b02 Updated ChangeLog. 2022-02-26 01:35:16 +02:00
Lauri Ojansivu b85db43c47 Fixed Disable Self-Registration. Added Disable Forgot Password to same Admin Panel page.
Thanks to xet7 !

Fixes #3971,
fixes #2839
2022-02-26 01:29:40 +02:00
viehlieb db6fc57515 fix userwas used before assignment 2022-02-24 13:08:55 +01:00
viehlieb 6b404da9f8 add functionality for oidc login to change MongoDB data for email, fullname, username, user.teams 2022-02-23 15:09:03 +01:00
viehlieb 4d31985eb9 enable add/remove labels for multiselect via shortcut 2022-02-23 14:58:13 +01:00
viehlieb 0e9aa2eeed translation files de + en for shortcut overview 2022-02-23 12:49:46 +01:00
viehlieb 7d73f2bbba bring back functionality for selectedCard which is currentCard and assigned functionality to numpad for label shortcuts 2022-02-23 12:49:08 +01:00
Lauri Ojansivu 4929979221 Updated to Node.js v14.19.0. Thanks to Node.js developers. 2022-02-23 11:51:56 +02:00
Lauri Ojansivu 90cc96302d Try to fix rebuild-wekan.sh .
Thanks to xet7 !
2022-02-23 10:30:30 +02:00
Lauri Ojansivu 4a074836fd Try to fix exception: Cannot read property title of undefined.
Thanks to xet7 !
2022-02-23 10:18:11 +02:00
Lauri Ojansivu 0e0bea0139 Merged meteor-files changes PR and removed wekan-cfs. 2022-02-23 09:38:28 +02:00
Lauri Ojansivu d00596f88a Merge branch 'feature-ostrio-files' of https://github.com/majus/wekan 2022-02-23 08:42:20 +02:00
Lauri Ojansivu 9ca8d78514 Updated translations. 2022-02-23 08:37:16 +02:00
Lauri Ojansivu 11d8096b8d Merge branch 'master' of github.com:wekan/wekan 2022-02-23 08:34:33 +02:00
Lauri Ojansivu a49a918547 Updated ChangeLog. 2022-02-23 08:34:25 +02:00
Lauri Ojansivu 4ebd113bf0 Merge pull request #4375 from pablo-ng/master
add subscription to announcements collection
2022-02-23 08:31:38 +02:00
Lauri Ojansivu 14df71de5b Updated ChangeLog. 2022-02-23 08:30:41 +02:00
Lauri Ojansivu 9f459a37b8 Merge pull request #4358 from mfilser/card_details_fix_header
Card details, fix header while scrolling
2022-02-23 08:29:03 +02:00
pablo-ng 5487c015db add subscription to announcements collection 2022-02-22 18:20:34 +01:00
Martin Filser 47ca6829eb Attachment migration, add error logs 2022-02-18 10:59:12 +03:00
Martin Filser 368fe24956 Ensure to create the upload directory 2022-02-18 10:59:12 +03:00
Martin Filser 086cb9c067 Don't add activity while the attachment migration 2022-02-18 10:59:12 +03:00
Martin Filser 25a2ad1144 Fix undefined list at activities / watchers 2022-02-18 10:59:12 +03:00
Martin Filser 926b617f33 .devcontainer, update image to ubuntu:rolling
- see also: 8446640060
2022-02-18 10:59:12 +03:00
Martin Filser f94ae76609 Adding WRITABLE_PATH to docker config 2022-02-18 10:59:12 +03:00
Lauri Ojansivu f46173077b Updated translations. 2022-02-17 20:31:12 +02:00
Martin Filser c373013134 Card Details Header always at top of all other scrollable elements 2022-02-14 23:07:30 +01:00
Martin Filser 12c5d2324d Card Details, fix card header while scrolling 2022-02-14 23:07:30 +01:00
Lauri Ojansivu e6dc20f6c7 Updated ChangeLog. 2022-02-12 20:22:50 +02:00
Lauri Ojansivu ea658842a2 Merge pull request #4352 from mfilser/card_details_popup_not_maximized
Global search: Card Details popup opens now in normal view even if maximized card is configured
2022-02-12 20:20:22 +02:00
Martin Filser 12f0c85546 Global search: Card Details popup opens now in normal view even if maximized card is configured
Fixes: #4346
2022-02-12 11:02:30 +01:00
Lauri Ojansivu 033a5d8186 Updated translations. 2022-02-10 15:01:14 +02:00
Lauri Ojansivu b769a71af3 v6.05 2022-02-07 18:56:10 +02:00
Lauri Ojansivu ad35e7b7bd Update release scripts to merge latest changes.
Thanks to xet7 !
2022-02-07 18:36:03 +02:00
Lauri Ojansivu a9e56f2b09 Updated ChangeLog. 2022-02-07 18:30:21 +02:00
Lauri Ojansivu 5f807b80fe Merge pull request #4345 from mfilser/fix_copy_move_card
Fix copy move card
2022-02-07 18:27:58 +02:00
Martin Filser 4d89eb6083 Add protection to change the list of the card 2022-02-07 16:56:35 +01:00
Martin Filser bd2739e78d Fix Copy/Move Card
Fixes: #4341, #4343
2022-02-07 16:51:55 +01:00
Martin Filser 265ee9ab83 Added back Dropdown field "List" to card details 2022-02-07 16:51:45 +01:00
Lauri Ojansivu 065485168a v6.04 2022-02-07 17:00:42 +02:00
Lauri Ojansivu 7d609ef0b1 Updated ChangeLog. 2022-02-07 16:35:04 +02:00
Lauri Ojansivu dc7b97c178 Fixed Problem with selecting action in rule window.
Thanks to Meeques and xet7 !

Fixes #4342
2022-02-07 16:31:01 +02:00
Lauri Ojansivu a5b376e6b5 Fixed Copy card to list does not work, by reverting clientside changes of PR 4333.
Thanks to Meeques, PaulITsoft and xet7 !

Fixes #4341,
fixes #4343
2022-02-07 15:15:24 +02:00
Lauri Ojansivu 993e99330f Updated translations. 2022-02-07 14:47:42 +02:00
Lauri Ojansivu e563212475 v6.03 2022-02-07 04:06:40 +02:00
Lauri Ojansivu cc54867976 Updated to Node.js v12.22.10. Thanks to Node.js developers. 2022-02-07 03:35:28 +02:00
Lauri Ojansivu 36250f83b9 v6.02 2022-02-06 16:10:25 +02:00
Lauri Ojansivu e715106d65 Updated translations. 2022-02-06 16:06:57 +02:00
Lauri Ojansivu f888b5cb23 Updated dependencies. 2022-02-06 15:58:30 +02:00
Denis Perov 59823a0661 Support WRITEABLE_PATH envrionemnt variable 2022-02-06 13:19:58 +03:00
David Arnold 6a9bc12664 Revert "use tempdirs"
This reverts commit a7d51cf21b.
2022-02-06 13:19:58 +03:00
David Arnold e99130d3ea use tempdirs 2022-02-06 13:19:58 +03:00
David Arnold 036fb3e794 fixup: migration 2022-02-06 13:19:58 +03:00
David Arnold a15ee068d1 hack: Nasty hack for covercard auth 2022-02-06 13:19:58 +03:00
David Arnold 1da242ae35 Revert "Adios cfs:* | Hello ostrio:file"
This reverts commit 093819e33c.
2022-02-06 13:19:58 +03:00
David Arnold addf669d44 migration: extract files from old storage and load into new storage 2022-02-06 13:19:58 +03:00
David Arnold 1c2dbe5149 Fix: access denied on second load 2022-02-06 13:19:58 +03:00
David Arnold 77cb5d88de fix: user avatar images & upload 2022-02-06 13:19:58 +03:00
David Arnold 1b591dcda9 Ref: pass through image size error message (correctly) 2022-02-06 13:19:58 +03:00
David Arnold 545fe96c30 Fix: image download dont open -> download 2022-02-06 13:19:58 +03:00
David Arnold d8d8a6a64d Rem: upload spinner.
attachmentGalery would need refactoring to an individual attachment
component with component state that could be set on the onUpdated event.

I'm not capable of doing this within reasonable time.
2022-02-06 13:19:58 +03:00
David Arnold 5a74d98795 Rem: unused previewAttachedImagePopup 2022-02-06 13:19:58 +03:00
David Arnold 0e8a02ee2c fix: thumbnail images now wrok 2022-02-06 13:19:58 +03:00
David Arnold 2c175f2be6 fixup! fix: cover image - works now 2022-02-06 13:19:58 +03:00
David Arnold e080aea61d fixup! Hello gridfs lib + fsHooks for mongodb bucket storage 2022-02-06 13:19:58 +03:00
David Arnold 59a936ae90 fix: activity download link 2022-02-06 13:19:58 +03:00
David Arnold c7500661b8 fix: cover image - works now 2022-02-06 13:19:58 +03:00
David Arnold 0ad7eb4753 fixup! Ref: original & and use fileObj.meta 2022-02-06 13:19:58 +03:00
David Arnold 0254282daf fixup! Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 13:19:58 +03:00
David Arnold d0a27aaec2 fixup! Ref: original & and use fileObj.meta 2022-02-06 13:19:58 +03:00
David Arnold be712541d5 Revert "Do those imports!"
This reverts commit 64dcc70bd2.
2022-02-06 13:19:58 +03:00
David Arnold 9471eb327e fixup! Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 13:19:58 +03:00
David Arnold c41335a967 fixup! Ref: Avatars to use modern gridfs 2022-02-06 13:19:58 +03:00
David Arnold 9de430fdc1 fixup! Ref: original & and use fileObj.meta 2022-02-06 13:19:58 +03:00
David Arnold 13a6067081 fixup! Ref: Avatars to use modern gridfs 2022-02-06 13:19:58 +03:00
David Arnold e2f7b94cde fixup! Ref: original & and use fileObj.meta 2022-02-06 13:19:58 +03:00
David Arnold ac7d16c40f fixup! Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 13:19:58 +03:00
David Arnold 3da88ed858 Do those imports! 2022-02-06 13:19:58 +03:00
David Arnold c85f710e74 fixup! Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 13:19:58 +03:00
David Arnold 7b64c8b235 fixup! Ref: Avatars to use modern gridfs 2022-02-06 13:19:58 +03:00
David Arnold f244125cd3 fixup! Mig: add migration cfs:* -> ostrio:files 2022-02-06 13:19:58 +03:00
David Arnold 692d853eca fixup! Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 13:19:58 +03:00
David Arnold eb747ef8e9 fixup! Ref: Avatars to use modern gridfs 2022-02-06 13:19:58 +03:00
David Arnold 412b60f794 fixup! Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 13:19:58 +03:00
David Arnold 0f91eaa0a0 fixup! Ref: Avatars to use modern gridfs 2022-02-06 13:19:58 +03:00
David Arnold 386828fe3e fixup! rm fix-download-unicode 2022-02-06 13:19:58 +03:00
David Arnold 9b1ff4dd6d Fixup(ostrio-files): wrong export 2022-02-06 13:19:58 +03:00
David Arnold 2dc6e15024 Mig: add migration cfs:* -> ostrio:files 2022-02-06 13:19:58 +03:00
David Arnold e702f17c7b Ref: original & and use fileObj.meta
fileObj.meta is part of the ostrio:files API and be passed to the
constructor. This is less hacky than trying tu update a persistet object
after the fact.
2022-02-06 13:19:58 +03:00
David Arnold 16506e7a6a Ref: Attachment upload handlers 2022-02-06 13:19:58 +03:00
David Arnold 08cc308992 Ref: Avatar upload handler 2022-02-06 13:19:58 +03:00
David Arnold ae8d4c1bbd Ref: attachment image paste 2022-02-06 13:19:58 +03:00
David Arnold e2934b9b09 Ref: trello & wekan importers 2022-02-06 13:19:58 +03:00
David Arnold 55acce9f0c Ref: Attachment upload handlers 2022-02-06 13:19:57 +03:00
Lauri Ojansivu 627d7d9456 v6.01 2022-02-06 11:30:52 +02:00
Lauri Ojansivu b62dd5782a Updated ChangeLog. 2022-02-06 11:05:03 +02:00
Lauri Ojansivu 0460a7d9d3 Added building fibers.
Thanks to xet7 !
2022-02-06 11:03:04 +02:00
Lauri Ojansivu 45d53dede4 Updated translations. 2022-02-06 10:28:03 +02:00
Lauri Ojansivu ce3c87f767 Updated ChangeLog. 2022-02-06 10:25:54 +02:00
Lauri Ojansivu ceed865e30 Updated to Node.js v14.19.0. Thanks to Node.js developers. 2022-02-06 10:09:17 +02:00
David Arnold 9c3043d40a Ref: Avatar upload handler 2022-02-06 10:56:32 +03:00
David Arnold a38a78d9a3 rm ATTACHMENTS_STORE_PATH 2022-02-06 10:56:31 +03:00
David Arnold 966541704c Ref: Attachments to use modern gridfs (rm localstore) 2022-02-06 10:55:54 +03:00
David Arnold 52a63c5423 Ref: Avatars to use modern gridfs 2022-02-06 10:55:54 +03:00
David Arnold 18bd797ab9 Hello gridfs lib + fsHooks for mongodb bucket storage 2022-02-06 10:55:54 +03:00
David Arnold d75fd69406 rm fix-download-unicode 2022-02-06 10:55:54 +03:00
Denis Perov 337470cbd0 Adios cfs:* | Hello ostrio:file 2022-02-06 10:55:54 +03:00
Lauri Ojansivu a9bd5c7496 v6.00 2022-02-05 14:34:36 +02:00
Lauri Ojansivu e1730c9912 Updated translations. 2022-02-05 14:25:43 +02:00
Lauri Ojansivu 8f1754be50 Updated ChangeLog. 2022-02-05 14:24:11 +02:00
Lauri Ojansivu 4ace1db9b0 Merge pull request #4333 from mfilser/card_details_list_select
Adding list select at card details
2022-02-05 14:15:36 +02:00
Lauri Ojansivu eff636ddd6 Updated ChangeLog. 2022-02-05 00:43:17 +02:00
Lauri Ojansivu 9b7bf1ba28 Updated release scripts.
Thanks to xet7 !
2022-02-05 00:41:29 +02:00
Lauri Ojansivu 7190057d0c Updated translations. 2022-02-04 19:16:34 +02:00
Martin Filser bb5b723520 Migrations, set "Show Lists" on card details on every board 2022-02-04 13:46:56 +01:00
Martin Filser a2e6f01469 Changed "List Icon" 2022-02-04 13:46:56 +01:00
Martin Filser 12ee7efc5f Always add space between "card details items" 2022-02-04 13:46:56 +01:00
Martin Filser 7c7640e63e Added Dropdown field "List" to card details 2022-02-04 13:46:56 +01:00
Lauri Ojansivu e668fdc500 v5.99 2022-02-04 13:08:30 +02:00
Lauri Ojansivu f02478d57c Updated ChangeLog. 2022-02-04 12:44:44 +02:00
Lauri Ojansivu 8fc117eb53 Updated ChangeLog. 2022-02-04 12:43:38 +02:00
Lauri Ojansivu af598b13e8 Remove not working options from rebuild-wekan.sh
Thanks to xet7 !
2022-02-04 12:42:03 +02:00
Lauri Ojansivu f00f164078 Updated translations. 2022-02-04 12:35:09 +02:00
Lauri Ojansivu 70ac18a7e6 Updated ChangeLog. 2022-02-04 12:31:39 +02:00
Lauri Ojansivu e461c4a018 Merge pull request #4332 from jghaanstra/master
Revert rounded corners minicard on moderndark theme
2022-02-04 12:25:54 +02:00
Jelger Haanstra 186364f227 Revert rounded corners minicard on moderndark theme 2022-02-04 08:36:27 +01:00
Lauri Ojansivu 72f9d45bbe Updated ChangeLog. 2022-02-03 22:24:50 +02:00
Lauri Ojansivu 6392e06a36 v5.98 2022-02-03 22:02:18 +02:00
Lauri Ojansivu c879e63fc2 Updated ChangeLog. 2022-02-03 21:30:44 +02:00
Lauri Ojansivu 290a6dfb6e Updated to Node.js v12.22.10. Thanks to Node.js developers. 2022-02-03 21:28:32 +02:00
Lauri Ojansivu 94c82d121c Updated translations. 2022-02-03 21:01:43 +02:00
Lauri Ojansivu 3e92d6f6a3 Merge pull request #4331 from mfilser/copy_checklist
Copy checklist
2022-02-03 20:53:25 +02:00
Martin Filser 3a2b50720e Copy Checklist added to checklist action popup
Relates to: #4306
2022-02-03 19:37:49 +01:00
Lauri Ojansivu 8f47e65684 Updated ChangeLog. 2022-02-03 20:36:37 +02:00
Martin Filser 95ebf3bda8 Extract class of current "Move Checklist Option" Component 2022-02-03 19:34:34 +01:00
Martin Filser ea95357ae4 Move Checklist, getBoardData only resets the swimlane and list if the board id was changed 2022-02-03 19:34:34 +01:00
Martin Filser 7501e255dd Move Checklist, Swimlane, Lists and Cards are now correctly loaded of the last Board wasn't the current Board 2022-02-03 19:34:34 +01:00
Lauri Ojansivu ff13571c71 Add more stack and heap to Node.js at all WeKan platforms.
Thanks to xet7 !

Related #3585
2022-02-03 20:33:58 +02:00
Lauri Ojansivu 6501173ce4 Updated ChangeLog. 2022-02-03 18:45:35 +02:00
Lauri Ojansivu 1d13040305 Merge pull request #4330 from mfilser/list_not_moveable_when_lists_require_scrolling
Lists now moveable when swimlane requires scrolling
2022-02-03 18:44:34 +02:00
Lauri Ojansivu af1439b274 Updated ChangeLog. 2022-02-03 18:43:26 +02:00
Martin Filser 32af18b33d Lists now moveable when swimlane requires scrolling
Fixes: #4322
2022-02-03 17:29:20 +01:00
Martin Filser a48e537b2d List sorting show's now the drag/drop placeholder 2022-02-03 17:29:20 +01:00
Martin Filser 424bc0e7c5 Swimlanes scrolls right/left while sorting the list column at the screen end 2022-02-03 17:29:20 +01:00
Lauri Ojansivu e98821fafc Merge pull request #4329 from mfilser/removed_space_new_checklists
Removed unnecessary space between checklist title and first checklist item if checklist progress is 0%
2022-02-03 16:43:03 +02:00
Lauri Ojansivu 2d61fcdef4 Updated ChangeLog. 2022-02-03 12:42:16 +02:00
Lauri Ojansivu 045160c7bb Make card corners round.
Thanks to Meeques and xet7 !

Fixes #4326
2022-02-03 12:39:19 +02:00
Martin Filser f98b03bee5 Removed unnecessary space between checklist title and first checklist item if checklist progress is 0% 2022-02-01 22:49:15 +01:00
Lauri Ojansivu 703baf4ce9 Updated ChangeLog. 2022-01-30 01:56:54 +02:00
Lauri Ojansivu 1bf1ed79e8 Try to fix tests by adding correct version of puppeteer, because newest puppeteer did not work.
Thanks to xet7 !
2022-01-30 01:55:03 +02:00
Lauri Ojansivu a7888f0c66 Updated ChangeLog. 2022-01-30 01:49:13 +02:00
Lauri Ojansivu 7122f59c51 Try to fix tests by adding puppeteer back.
Thanks to xet7 !
2022-01-30 01:48:11 +02:00
Lauri Ojansivu 839266903a Updated ChangeLog. 2022-01-30 01:44:28 +02:00
Lauri Ojansivu a8e3dc06fe Part 3: Added translation: Galician (Spain).
Thanks to translators!
2022-01-30 01:43:05 +02:00
Lauri Ojansivu 7e0bc91a44 Updated ChangeLog. 2022-01-30 01:34:12 +02:00
Lauri Ojansivu 62efb67d06 Fix typo in tests. 2022-01-30 01:32:52 +02:00
Lauri Ojansivu 00fd47105d Updated translations. 2022-01-30 01:26:42 +02:00
Lauri Ojansivu 1bee24fa68 Updated ChangeLog. 2022-01-30 01:24:20 +02:00
Lauri Ojansivu 9a539fb414 Updated translations. 2022-01-30 01:21:19 +02:00
Lauri Ojansivu c0828f2d00 Added translation: Galician (Spain).
Thanks to translators!
2022-01-30 01:13:22 +02:00
Lauri Ojansivu 90c70aef96 Updated dependencies. 2022-01-23 13:21:24 +02:00
370 changed files with 3897 additions and 26096 deletions

No files matched your search

+25 -4
View File
@@ -1,4 +1,4 @@
FROM quay.io/wekan/ubuntu:groovy-20210115
FROM ubuntu:rolling
LABEL maintainer="sgr"
ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python git ca-certificates iproute2"
@@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive
ENV \
DEBUG=false \
NODE_VERSION=v12.22.9 \
NODE_VERSION=v14.19.0 \
METEOR_RELEASE=1.10.2 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
@@ -132,7 +132,16 @@ ENV \
SAML_IDENTIFIER_FORMAT="" \
SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \
SAML_ATTRIBUTES="" \
DEFAULT_WAIT_SPINNER=""
DEFAULT_WAIT_SPINNER="" \
NODE_OPTIONS="--max_old_space_size=4096"
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
# NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
# Install OS
RUN set -o xtrace \
@@ -229,7 +238,9 @@ RUN \
set -o xtrace && \
cd /home/wekan/app_build/bundle/programs/server/ && \
chmod u+w package.json npm-shrinkwrap.json && \
npm install
npm install && \
cd node_modules/fibers && \
node build.js
USER root
# Cleanup
@@ -248,4 +259,14 @@ ENV PORT=3000
EXPOSE $PORT
WORKDIR /home/wekan/app
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
# NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
#TODO:
#CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
CMD ["/home/wekan/.meteor/meteor", "run", "--verbose", "--settings", "settings.json"]
+2
View File
@@ -9,4 +9,6 @@ cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/pa
cd .build/bundle/programs/server
rm -rf node_modules
/home/wekan/.meteor/meteor npm install
cd node_modules/fibers
node build.js
cd /home/wekan/app
+2
View File
@@ -33,10 +33,12 @@ services:
- WITH_API=true
- RICHER_CARD_COMMENT_EDITOR=true
- BROWSER_POLICY_ENABLED=true
- WRITABLE_PATH=/data
depends_on:
- wekandb-dev
volumes:
- /etc/localtime:/etc/localtime:ro
- ./volumes/data:/data
- ../client:/home/wekan/app/client
- ../models:/home/wekan/app/models
- ../config:/home/wekan/app/config
+1 -1
View File
@@ -81,7 +81,7 @@ parts:
wekan:
source: .
plugin: nodejs
node-engine: 12.22.9
node-engine: 14.19.0
node-packages:
- node-gyp
- node-pre-gyp
+1 -1
View File
@@ -83,7 +83,7 @@ parts:
wekan:
source: .
plugin: nodejs
node-engine: 12.22.9
node-engine: 14.19.0
node-packages:
- node-gyp
- node-pre-gyp
+1 -1
View File
@@ -118,7 +118,7 @@ jobs:
.meteor/local/isopacks
.meteor/local/bundler-cache/scanner
key: v1-meteor_build_cache-${{ github.ref }}-${{ github.sha }}
restore-key: |
restore-keys: |
v1-meteor_build_cache-
- name: Setup meteor
+7 -4
View File
@@ -17,7 +17,7 @@ es5-shim@4.8.0
# Collections
aldeed:collection2
wekan-cfs-standard-packages
cfs:standard-packages
cottz:publish-relations
dburles:collection-helpers
idmontie:migrations
@@ -73,8 +73,8 @@ email@2.0.0
horka:swipebox
dynamic-import@0.6.0
accounts-password@1.7.0
wekan-cfs-gridfs
accounts-password@1.6.2
cfs:gridfs
rzymek:fullcalendar
momentjs:moment@2.22.2
browser-policy-framing@1.1.0
@@ -89,7 +89,10 @@ meteorhacks:aggregate@1.3.0
wekan-markdown
konecty:mongo-counter
percolate:synced-cron
wekan-cfs-filesystem
cfs:filesystem
ostrio:cookies
ostrio:files@2.0.1
tmeasday:check-npm-versions
steffo:meteor-accounts-saml
rajit:bootstrap3-datepicker-fi
rajit:bootstrap3-datepicker-ar
+21 -18
View File
@@ -23,7 +23,24 @@ browser-policy-framing@1.1.0
caching-compiler@1.2.2
caching-html-compiler@1.2.0
callback-hook@1.3.0
cfs:access-point@0.1.49
cfs:base-package@0.0.30
cfs:collection@0.5.5
cfs:collection-filters@0.2.4
cfs:data-man@0.0.6
cfs:file@0.1.17
cfs:filesystem@0.1.2
cfs:gridfs@0.0.34
cfs:http-methods@0.0.32
cfs:http-publish@0.0.13
cfs:power-queue@0.9.11
cfs:reactive-list@0.0.9
cfs:reactive-property@0.0.4
cfs:standard-packages@0.5.10
cfs:storage-adapter@0.2.4
cfs:tempstore@0.1.6
cfs:upload-http@0.0.20
cfs:worker@0.1.5
check@1.3.1
chuangbo:cookie@1.1.0
coagmano:stylus@1.1.0
@@ -117,6 +134,8 @@ oauth2@1.3.0
observe-sequence@1.0.16
ongoworks:speakingurl@1.1.0
ordered-dict@1.1.0
ostrio:cookies@2.7.0
ostrio:files@2.0.1
pascoual:pdfkit@1.0.7
peerlibrary:assert@0.3.0
peerlibrary:base-component@0.16.0
@@ -211,8 +230,10 @@ templating@1.4.0
templating-compiler@1.4.1
templating-runtime@1.4.0
templating-tools@1.2.0
tmeasday:check-npm-versions@1.0.2
tracker@1.2.0
twbs:bootstrap@3.3.6
typescript@4.2.2
ui@1.0.13
underscore@1.0.10
url@1.3.2
@@ -224,24 +245,6 @@ webapp-hashing@1.1.0
wekan-accounts-cas@0.1.0
wekan-accounts-lockout@1.0.0
wekan-accounts-oidc@1.0.10
wekan-cfs-access-point@0.1.50
wekan-cfs-base-package@0.0.30
wekan-cfs-collection@0.5.5
wekan-cfs-collection-filters@0.2.4
wekan-cfs-data-man@0.0.6
wekan-cfs-file@0.1.17
wekan-cfs-filesystem@0.1.2
wekan-cfs-gridfs@0.0.34
wekan-cfs-http-methods@0.0.32
wekan-cfs-http-publish@0.0.13
wekan-cfs-power-queue@0.9.11
wekan-cfs-reactive-list@0.0.9
wekan-cfs-reactive-property@0.0.4
wekan-cfs-standard-packages@0.5.10
wekan-cfs-storage-adapter@0.2.4
wekan-cfs-tempstore@0.1.6
wekan-cfs-upload-http@0.0.21
wekan-cfs-worker@0.1.5
wekan-ldap@0.0.2
wekan-markdown@1.0.9
wekan-oidc@1.0.12
+1 -1
View File
@@ -3,7 +3,7 @@ sudo: required
env:
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
TRAVIS_NODE_VERSION: 12.22.9
TRAVIS_NODE_VERSION: 14.19.0
TRAVIS_NPM_VERSION: latest
before_install:
+1 -1
View File
@@ -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_AT:de-AT, de_CH:de-CH, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, 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, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, 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, et_EE:et-EE, 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, gl_ES:gl-ES, 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, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK
[wekan.application]
file_filter = i18n/<lang>.i18n.json
+202
View File
@@ -1,5 +1,207 @@
[Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac)
# v6.10 2022-03-02 WeKan ® release
This release adds the following new features:
- [Switch from CollectionFS to Meteor-Files](https://github.com/wekan/wekan/pull/4336).
NOTE: This does not yet have migration feature to filesystem or S3.
Thanks to imajus, mfilser and xet7.
- [Added Meteor-Files WRITEABLE_PATH for Sandstorm, Snap and Source](https://github.com/wekan/wekan/commit/cc0658a225ef35a6153feab2ad0c0eb40ad66eeb).
Thanks to xet7.
- [Added WRITABLE_PATH to be usable when developing with meteor command, and to torodb](https://github.com/wekan/wekan/commit/e0d8ddf0034a6d2a7f259a71544ec4c57d23f0c5).
Thanks to xet7.
- [Enabled building Sandstorm WeKan, now that file uploading with Meteor-Files works](https://github.com/wekan/wekan/commit/dc99218e4ecb766e7947f8a0298236dead140b9f).
Thanks to imajus, mfilser and xet7.
and adds the following updates:
- [Updated to Node.js v14.19.0](https://github.com/wekan/wekan/commit/492997922129f4076c61c1bd8822851d39ce3f11).
Thanks to Node.js developers.
- [Use Node 14 at rebuild-wekan.sh](https://github.com/wekan/wekan/commit/ab33866d1a5a9080688c0c5f857d12c4117b9311).
Thanks to xet7.
- Updated dependencies.
[Part 1](https://github.com/wekan/wekan/commit/1a7a41698c1a5180e5ffa7d6b84820e05864ac77),
[Part 2](https://github.com/wekan/wekan/commit/9b4179e163bbf6690070fe1e6a14799f2ea17df6).
Thanks to developers of dependencies.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.09 2022-02-28 WeKan ® release
This release tries to fix the following bugs:
- [Try to fix Admin Panel / Disable Registration and Disable Forgot Password](https://github.com/wekan/wekan/commit/0775e2a3e5c5d98e4d8c1954a15beb0688c73075).
Thanks to urmel1960, Ben0it-T and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.08 2022-02-27 WeKan ® release
This release tries to fix the following bugs:
- [Try to allow register and login](https://github.com/wekan/wekan/commit/3076547cee3a5fabe8df106ddbbd6ce1e6c91a8b).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.07 2022-02-26 WeKan ® release
This release fixes the following bugs:
- [Fix Forgot Password to be optional](https://github.com/wekan/wekan/commit/9bd68794555009f5eabad269ed642efa4e3010f1).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.06 2022-02-26 WeKan ® release
This release adds the following new features:
- [Feature/shortcuts for label assignment](https://github.com/wekan/wekan/pull/4377).
Thanks to Viehlieb.
- [Feature/propagate OIDC data](https://github.com/wekan/wekan/pull/4379).
Thanks to Viehlieb.
and fixes the following bugs:
- [Global search: Card Details popup opens now in normal view even if maximized card is configured](https://github.com/wekan/wekan/pull/4352).
Thanks to mfilser.
- [Card details, fix header while scrolling](https://github.com/wekan/wekan/pull/4358).
Thanks to mfilser.
- [Add subscription to announcements, so that system wide announcements are shown to all](https://github.com/wekan/wekan/pull/4375).
Thanks to pablo-ng.
- [Fixed Disable Self-Registration. Added Disable Forgot Password to same Admin Panel page](https://github.com/wekan/wekan/commit/b85db43c4755cf54e550f664311cd95097d68ae1).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.05 2022-02-07 WeKan ® release
This release adds the following updates:
- [Update release scripts to merge latest changes](https://github.com/wekan/wekan/commit/ad35e7b7bd1d6d7568b3a5d692941e03e4623c1a).
Thanks to xet7.
and fixes the following bugs:
- [Fix copy move card](https://github.com/wekan/wekan/pull/4345).
Thanks to mfilser.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.04 2022-02-07 WeKan ® release
This release fixes the following bugs:
- [Fixed Copy card to list does not work, by reverting clientside changes of PR 4333](https://github.com/wekan/wekan/commit/a5b376e6b5f9b171c39cd9341b8c2a4346fc3f5e).
Thanks to Meeques, PaulITsoft and xet7.
- [Fixed Problem with selecting action in rule window](https://github.com/wekan/wekan/commit/dc7b97c1780849b04389696f0dac38e4477e28cf).
Thanks to Meeques and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.03 2022-02-07 WeKan ® release
This release adds the following updates:
- [Updated to Node.js v12.22.10](https://github.com/wekan/wekan/commit/cc5486797648b8098e50fa4f68cc4b588f41ab60).
Thanks to Node.js developers.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.02 2022-02-06 WeKan ® release
This release adds the following updates:
- [Updated dependencies](https://github.com/wekan/wekan/commit/f888b5cb23917c01cef7a84cf23314051ec6bfff).
Thanks to developers of dependencies.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.01 2022-02-06 WeKan ® release
This release adds the following updates:
- [Updated to Node.js v14.19.0](https://github.com/wekan/wekan/commit/ceed865e305f41ec027f1ed345b041841c9812c0).
Thanks to Node.js developers.
and fixes the following bugs:
- [Fixed WeKan on Sandstorm](https://github.com/sandstorm-io/meteor-spk/pull/41).
Thanks to xet7.
- [Fixed building fibers](https://github.com/wekan/wekan/commit/0460a7d9d3219ed7ba5aa5040349b9d56e6a45e0).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v6.00 2022-02-05 WeKan ® release
This release adds the following new features:
- [Adding list select at card details](https://github.com/wekan/wekan/pull/4333).
Thanks to mfilser.
and adds the following updates:
- [Updated release scripts](https://github.com/wekan/wekan/commit/9b7bf1ba289f0026f0bf957527c86b6f4696686e).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.99 2022-02-04 WeKan ® release
This release adds the following changes:
- [Revert rounded corners minicard on moderndark theme](https://github.com/wekan/wekan/pull/4332).
Thanks to jghaanstra.
and fixes the following bugs:
- [Remove not working options from rebuild-wekan.sh](https://github.com/wekan/wekan/commit/af598b13e8266654ab52425f71840c3628c9835a).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.98 2022-02-03 WeKan ® release
This release adds the following CRITICAL SECURITY UPDATES:
- [Updated to Node.js v12.22.10](https://github.com/wekan/wekan/commit/290a6dfb6e104b887f9ee2cc70db84b83fe3be35).
Thanks to Node.js developers.
and adds the following new features:
- [Make card corners round](https://github.com/wekan/wekan/commit/045160c7bb7c8696a181d9ed4e0b54d0c27b5f59).
Thanks to Meeques and xet7.
- [Copy checklist](https://github.com/wekan/wekan/pull/4331).
Thanks to mfilser.
and adds the following new translations:
- Added translation: Galician (Spain).
[Part 1](https://github.com/wekan/wekan/commit/c0828f2d00095c68b4533a10ff7ede0a16131093),
[Part 2](https://github.com/wekan/wekan/commit/9a539fb414c3ffeae2ea94f863d2bb3bc6e314f1),
[Part 3](https://github.com/wekan/wekan/commit/a8e3dc06fe76620d09eddbc7d118a749c85b1c7c).
Thanks to translators.
and fixes the following bugs:
- [Fix typo in tests](https://github.com/wekan/wekan/commit/62efb67d06a4aeb3299805911391b6e936901b42).
Thanks to xet7.
- Try to fix tests by adding puppeteer back.
[Part 1](https://github.com/wekan/wekan/commit/7122f59c51775f9b382cdbcf5690eba2ad907ccf),
[Part 2](https://github.com/wekan/wekan/commit/1bf1ed79e85e091d79fa70feb46d072c81e55810).
Thanks to xet7.
- [Removed unnecessary space between checklist title and first checklist item if checklist progress is 0%](https://github.com/wekan/wekan/pull/4329).
Thanks to mfilser.
- [Lists now moveable when swimlane requires scrolling](https://github.com/wekan/wekan/pull/4330).
Thanks to mfilser.
- [Add more stack and heap to Node.js at all WeKan platforms](https://github.com/wekan/wekan/commit/ff13571c719ad24e24ea6dc871ced827a7120ac8).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.97 2022-01-23 WeKan ® release
This release fixes the following bugs:
+25 -6
View File
@@ -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.9 \
NODE_VERSION=v14.19.0 \
METEOR_RELEASE=1.10.2 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
@@ -31,7 +31,6 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \
RICHER_CARD_COMMENT_EDITOR=false \
CARD_OPENED_WEBHOOK_ENABLED=false \
ATTACHMENTS_STORE_PATH="" \
MAX_IMAGE_PIXEL="" \
IMAGE_COMPRESS_RATIO="" \
NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \
@@ -140,7 +139,16 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \
SAML_ATTRIBUTES="" \
ORACLE_OIM_ENABLED=false \
WAIT_SPINNER=""
WAIT_SPINNER="" \
NODE_OPTIONS="--max_old_space_size=4096"
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
# NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
# Copy the app to the image
COPY ${SRC_PATH} /home/wekan/app
@@ -281,9 +289,7 @@ RUN \
chmod u+w *.json && \
gosu wekan:wekan npm install && \
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
#cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
#rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs && \
#chown wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
#Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
#https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac
#https://github.com/wekan/wekan/commit/7eeabf14be3c63fae2226e561ef8a0c1390c8d3c
@@ -298,6 +304,9 @@ RUN \
cd /home/wekan/app_build/bundle/programs/server/ && \
chmod u+w *.json && \
gosu wekan:wekan npm install && \
cd node_modules/fibers && \
node build.js && \
cd ../.. && \
#gosu wekan:wekan npm install bcrypt && \
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy && \
@@ -323,4 +332,14 @@ ENV PORT=8080
EXPOSE $PORT
USER wekan
CMD ["node", "/build/main.js"]
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
# NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
#
# CMD ["node", "/build/main.js"]
CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
+24 -4
View File
@@ -4,9 +4,18 @@ 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.9 \
NODE_VERSION=v14.19.0 \
WEKAN_VERSION=latest \
WEKAN_ARCHITECTURE=arm64
WEKAN_ARCHITECTURE=arm64 \
NODE_OPTIONS="--max_old_space_size=4096"
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
# NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
# Install dependencies
RUN apk update && apk add ca-certificates outils-sha1 && \
@@ -40,7 +49,7 @@ LABEL maintainer="wekan"
# Set the environment variables (defaults where required)
ENV QEMU_ARCHITECTURE=aarch64 \
NODE_ARCHITECTURE=linux-arm64 \
NODE_VERSION=v12.22.9 \
NODE_VERSION=v14.19.0 \
NODE_ENV=production \
NPM_VERSION=latest \
WITH_API=true \
@@ -74,4 +83,15 @@ RUN \
EXPOSE $PORT
USER wekan
CMD ["node", "/home/wekan/bundle/main.js"]
#---------------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap:
# NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------------
#
#CMD ["node", "/home/wekan/bundle/main.js"]
CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /home/wekan/bundle/main.js"]
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v5.97.0"
appVersion: "v6.10.0"
files:
userUploads:
- README.md
+3 -3
View File
@@ -196,14 +196,14 @@ BlazeComponent.extendComponent({
// trying to display url before file is stored generates js errors
return (
(attachment &&
attachment.url({ download: true }) &&
attachment.path &&
Blaze.toHTML(
HTML.A(
{
href: attachment.url({ download: true }),
href: `${attachment.link()}?download=true`,
target: '_blank',
},
DOMPurify.sanitize(attachment.name()),
DOMPurify.sanitize(attachment.name),
),
)) ||
DOMPurify.sanitize(this.currentData().activity.attachmentName)
+17 -6
View File
@@ -15,9 +15,16 @@ setBoardColor(color)
.is-selected .minicard
border-left: 3px solid color
// All minicards rounded corners:
.minicard
border-radius: 7px
padding: 10px 10px 4px 10px
box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.15)
button[type=submit].primary, input[type=submit].primary,
.sidebar .sidebar-content .sidebar-btn
background-color: darken(color, 20%)
border-radius: 7px
&.pop-over .pop-over-list li a:not(.disabled):hover,
.sidebar .sidebar-content .sidebar-btn:hover,
@@ -197,6 +204,7 @@ setBoardColor(color)
.open-minicard-composer:hover
background-color:rgba(255,255,255,.8) !important
color:#000
border-radius: 7px
/*
.minicard, .minicard .badge
@@ -457,7 +465,7 @@ setBoardClear(color1,color2)
background-color: rgba(255,255,255,0.7)
color: rgba(0,0,0,0.8)
box-shadow: 0 1px 2px rgba(0,0,0,.2)
border-radius: 7px
.quiet, .quiet a
color: rgba(0,0,0,0.4)
@@ -472,6 +480,7 @@ setBoardClear(color1,color2)
a:not(.disabled).is-active.fa, a:not(.disabled).is-active i.fa, a:not(.disabled):hover.fa, a:not(.disabled):hover i.fa
color: rgba(0,0,0,0.6)
border-radius: 7px
input[type="email"], input[type="password"], input[type="text"]
border: 0
@@ -766,6 +775,7 @@ setBoardClear(color1,color2)
/* Forms */
button[type=submit].primary, .board-color-modern input[type=submit].primary
background-color: #777777
border-radius: 7px
.toggle-switch:checked~.toggle-label
background-color: #f7f7f7
@@ -774,7 +784,7 @@ setBoardClear(color1,color2)
background-color: #777777 !important
button, input:not([type=file]), select, textarea
border-radius: 2px
border-radius: 7px
/* Headers */
&#header
@@ -863,11 +873,11 @@ setBoardClear(color1,color2)
.swimlane .list:nth-child(even) .list-header,
.swimlane .list:nth-child(even) .list-body
background: #5f5f5f
background: #6a6a6a
.swimlane .list:nth-child(odd) .list-header,
.swimlane .list:nth-child(odd) .list-body
background: #3b3b3b
background: #555555
.list-header
padding: 10px
@@ -914,6 +924,7 @@ setBoardClear(color1,color2)
.list-body a.open-minicard-composer:hover, .list-body a.open-minicard-composer:hover i, .list .list-composer .open-list-composer:hover i
color: #ffffff
border-radius: 7px
/* Mini Card */
.minicard-wrapper
@@ -924,13 +935,13 @@ setBoardClear(color1,color2)
color: #cccccc
border-radius: 2px
font-size: 0.95em
padding: 10px
box-shadow: 0 4px 3px -3px rgba(0,0,0,0.8)
border-bottom: 1px solid #666666
padding: 8px
.minicard:hover
color: #f7f7f7
background-color: #797979 !important
background-color: #4d4d4d !important
.minicard .minicard-labels
margin-bottom: 4px
+8 -11
View File
@@ -11,9 +11,6 @@ template(name="previewClipboardImagePopup")
img.preview-clipboard-image()
button.primary.js-upload-pasted-image {{_ 'upload'}}
template(name="previewAttachedImagePopup")
img.preview-large-image.js-large-image-clicked(src="{{url}}")
template(name="attachmentDeletePopup")
p {{_ "attachment-delete-pop"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
@@ -22,31 +19,31 @@ template(name="attachmentsGalery")
.attachments-galery
each attachments
.attachment-item
a.attachment-thumbnail.swipebox(href="{{url}}" title="{{name}}")
a.attachment-thumbnail.swipebox(href="{{link}}" title="{{name}}")
if isUploaded
if isImage
img.attachment-thumbnail-img(src="{{url}}")
img.attachment-thumbnail-img(src="{{link}}")
else if($eq extension 'mp3')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="audio/mpeg")
source(src="{{link}}" type="audio/mpeg")
else if($eq extension 'ogg')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="video/ogg")
source(src="{{link}}" type="video/ogg")
else if($eq extension 'webm')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="video/webm")
source(src="{{link}}" type="video/webm")
else if($eq extension 'mp4')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="video/mp4")
source(src="{{link}}" type="video/mp4")
else
span.attachment-thumbnail-ext= extension
else
+spinner
span.attachment-thumbnail-ext= extension
p.attachment-details
= name
span.file-size ({{fileSize size}} KB)
span.attachment-details-actions
a.js-download(href="{{url download=true}}")
a.js-download(href="{{link}}?download=true", download="{{name}}")
i.fa.fa-download
| {{_ 'download'}}
if currentUser.isBoardMember
+44 -96
View File
@@ -13,35 +13,10 @@ Template.attachmentsGalery.events({
event.stopPropagation();
},
'click .js-add-cover'() {
Cards.findOne(this.cardId).setCover(this._id);
Cards.findOne(this.meta.cardId).setCover(this._id);
},
'click .js-remove-cover'() {
Cards.findOne(this.cardId).unsetCover();
},
'click .js-preview-image'(event) {
Popup.open('previewAttachedImage').call(this, event);
// when multiple thumbnails, if click one then another very fast,
// we might get a wrong width from previous img.
// when popup reused, onRendered() won't be called, so we cannot get there.
// here make sure to get correct size when this img fully loaded.
const img = $('img.preview-large-image')[0];
if (!img) return;
const rePosPopup = () => {
const w = img.width;
const h = img.height;
// if the image is too large, we resize & center the popup.
if (w > 300) {
$('div.pop-over').css({
width: w + 20,
position: 'absolute',
left: (window.innerWidth - w) / 2,
top: (window.innerHeight - h) / 2,
});
}
};
const url = $(event.currentTarget).attr('src');
if (img.src === url && img.complete) rePosPopup();
else img.onload = rePosPopup;
Cards.findOne(this.meta.cardId).unsetCover();
},
});
@@ -54,59 +29,30 @@ Template.attachmentsGalery.helpers({
},
});
Template.previewAttachedImagePopup.events({
'click .js-large-image-clicked'() {
Popup.back();
},
});
Template.cardAttachmentsPopup.events({
'change .js-attach-file'(event) {
const card = this;
const processFile = f => {
Utils.processUploadedAttachment(card, f, attachment => {
if (attachment && attachment._id && attachment.isImage()) {
card.setCover(attachment._id);
if (event.currentTarget.files && event.currentTarget.files[0]) {
const uploader = Attachments.insert(
{
file: event.currentTarget.files[0],
meta: Utils.getCommonAttachmentMetaFrom(card),
chunkSize: 'dynamic',
},
false,
);
uploader.on('uploaded', (error, fileRef) => {
if (!error) {
if (fileRef.isImage) {
card.setCover(fileRef._id);
}
}
});
uploader.on('end', (error, fileRef) => {
Popup.back();
});
};
FS.Utility.eachFile(event, f => {
if (
MAX_IMAGE_PIXEL > 0 &&
typeof f.type === 'string' &&
f.type.match(/^image/)
) {
// is image
const reader = new FileReader();
reader.onload = function(e) {
const dataurl = e && e.target && e.target.result;
if (dataurl !== undefined) {
Utils.shrinkImage({
dataurl,
maxSize: MAX_IMAGE_PIXEL,
ratio: COMPRESS_RATIO,
toBlob: true,
callback(blob) {
if (blob === false) {
processFile(f);
} else {
blob.name = f.name;
processFile(blob);
}
},
});
} else {
// couldn't process it let other function handle it?
processFile(f);
}
};
reader.readAsDataURL(f);
} else {
processFile(f);
}
});
uploader.start();
}
},
'click .js-computer-upload'(event, templateInstance) {
templateInstance.find('.js-attach-file').click();
@@ -154,30 +100,32 @@ Template.previewClipboardImagePopup.onRendered(() => {
Template.previewClipboardImagePopup.events({
'click .js-upload-pasted-image'() {
const results = pastedResults;
if (results && results.file) {
const card = this;
if (pastedResults && pastedResults.file) {
const file = pastedResults.file;
window.oPasted = pastedResults;
const card = this;
const file = new FS.File(results.file);
if (!results.name) {
// if no filename, it's from clipboard. then we give it a name, with ext name from MIME type
if (typeof results.file.type === 'string') {
file.name(results.file.type.replace('image/', 'clipboard.'));
const uploader = Attachments.insert(
{
file,
meta: Utils.getCommonAttachmentMetaFrom(card),
fileName: file.name || file.type.replace('image/', 'clipboard.'),
chunkSize: 'dynamic',
},
false,
);
uploader.on('uploaded', (error, fileRef) => {
if (!error) {
if (fileRef.isImage) {
card.setCover(fileRef._id);
}
}
}
file.updatedAt(new Date());
file.boardId = card.boardId;
file.cardId = card._id;
file.userId = Meteor.userId();
const attachment = Attachments.insert(file);
if (attachment && attachment._id && attachment.isImage()) {
card.setCover(attachment._id);
}
pastedResults = null;
$(document.body).pasteImageReader(() => {});
Popup.back();
});
uploader.on('end', (error, fileRef) => {
pastedResults = null;
$(document.body).pasteImageReader(() => {});
Popup.back();
});
uploader.start();
}
},
});
-5
View File
@@ -51,11 +51,6 @@
display: block
box-shadow: 0 1px 2px rgba(0,0,0,.2)
.preview-large-image
max-width: 1000px
display: block
box-shadow: 0 1px 2px rgba(0,0,0,.2)
.preview-clipboard-image
width: 280px
max-width: 100%;
+9
View File
@@ -234,6 +234,15 @@ template(name="cardDetails")
+viewer
= sort
if currentBoard.allowsShowLists
.card-details-item.card-details-show-lists
h3.card-details-item-title
i.fa.fa-list
| {{_ 'list'}}
select.js-select-card-details-lists(disabled="{{#unless canModifyCard}}disabled{{/unless}}")
each currentBoard.lists
option(value="{{_id}}" selected="{{#if isCurrentListId _id}}selected{{/if}}") {{title}}
//.card-details-items
if getSpentTime
.card-details-item.card-details-item-spent
+16 -1
View File
@@ -70,7 +70,7 @@ BlazeComponent.extendComponent({
cardMaximized() {
return Meteor.user().hasCardMaximized();
return !Utils.getPopupCardId() && Meteor.user().hasCardMaximized();
},
canModifyCard() {
@@ -168,6 +168,15 @@ BlazeComponent.extendComponent({
);
},
/** returns if the list id is the current list id
* @param listId list id to check
* @return is the list id the current list id ?
*/
isCurrentListId(listId) {
const ret = this.data().listId == listId;
return ret;
},
onRendered() {
if (Meteor.settings.public.CARD_OPENED_WEBHOOK_ENABLED) {
// Send Webhook but not create Activities records ---
@@ -379,6 +388,12 @@ BlazeComponent.extendComponent({
card.move(card.boardId, card.swimlaneId, card.listId, sort);
}
},
'change .js-select-card-details-lists'(event) {
let card = this.data();
const listSelect = this.$('.js-select-card-details-lists')[0];
const listId = listSelect.options[listSelect.selectedIndex].value;
card.move(card.boardId, card.swimlaneId, listId, card.sort);
},
'click .js-go-to-linked-card'() {
Utils.goCardId(this.data().linkedId);
},
+4 -3
View File
@@ -110,6 +110,9 @@ avatar-radius = 50%
padding: 7px 20px
background: darken(white, 7%)
border-bottom: 1px solid darken(white, 14%)
position: sticky
top: 0px
z-index: 500
.card-number {
color: darken(white, 30%);
@@ -211,13 +214,13 @@ avatar-radius = 50%
.card-details-item
margin-right: 0.5em
flex-grow: 1
&:last-child
margin-right: 0
&.card-details-item-labels
display: block
word-wrap: break-word
max-width: 95%
flex-grow: 1
&.card-details-item-members,
&.card-details-item-assignees,
&.card-details-item-customfield,
@@ -225,7 +228,6 @@ avatar-radius = 50%
display: block
word-wrap: break-word
max-width: 36%
flex-grow: 1
&.card-details-item-creator,
&.card-details-item-received,
&.card-details-item-start,
@@ -234,7 +236,6 @@ avatar-radius = 50%
display: block
word-wrap: break-word
max-width: 28%
flex-grow: 1
&.custom-fields
padding-left: 10px
+18 -8
View File
@@ -44,10 +44,11 @@ template(name="checklistDetail")
+viewer
= checklist.title
.checklist-progress-bar-container
.checklist-progress-text {{#if $gt finishedPercent 0}}{{finishedPercent}}%{{/if}}
.checklist-progress-bar
.checklist-progress(style="width:{{finishedPercent}}%;{{#if $eq finishedPercent 0}}display:none{{/if}}")
if $gt finishedPercent 0
.checklist-progress-bar-container
.checklist-progress-text {{finishedPercent}}%
.checklist-progress-bar
.checklist-progress(style="width:{{finishedPercent}}%")
+checklistItems(checklist = checklist)
template(name="checklistDeletePopup")
@@ -152,8 +153,17 @@ template(name="checklistActionsPopup")
a.js-move-checklist.move-checklist
i.fa.fa-arrow-right
| {{_ "moveChecklist"}} ...
a.js-copy-checklist.copy-checklist
i.fa.fa-copy
| {{_ "copyChecklist"}} ...
template(name="copyChecklistPopup")
+copyAndMoveChecklist
template(name="moveChecklistPopup")
+copyAndMoveChecklist
template(name="copyAndMoveChecklist")
unless currentUser.isWorker
label {{_ 'boards'}}:
select.js-select-boards(autofocus)
@@ -161,22 +171,22 @@ template(name="moveChecklistPopup")
if $eq _id currentBoard._id
option(value="{{_id}}" selected) {{_ 'current'}}
else
option(value="{{_id}}" selected="{{#if isMoveChecklistDialogOptionBoardId _id}}selected{{/if}}") {{title}}
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionBoardId _id}}selected{{/if}}") {{title}}
label {{_ 'swimlanes'}}:
select.js-select-swimlanes
each swimlanes
option(value="{{_id}}" selected="{{#if isMoveChecklistDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
label {{_ 'lists'}}:
select.js-select-lists
each lists
option(value="{{_id}}" selected="{{#if isMoveChecklistDialogOptionListId _id}}selected{{/if}}") {{title}}
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionListId _id}}selected{{/if}}") {{title}}
label {{_ 'cards'}}:
select.js-select-cards
each cards
option(value="{{_id}}" selected="{{#if isMoveChecklistDialogOptionCardId _id}}selected{{/if}}") {{title}}
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionCardId _id}}selected{{/if}}") {{title}}
.edit-controls.clearfix
button.primary.confirm.js-done {{_ 'done'}}
+85 -41
View File
@@ -313,6 +313,7 @@ BlazeComponent.extendComponent({
}
}),
'click .js-move-checklist' : Popup.open('moveChecklist'),
'click .js-copy-checklist' : Popup.open('copyChecklist'),
}
]
}
@@ -378,47 +379,60 @@ BlazeComponent.extendComponent({
},
}).register('checklistItemDetail');
BlazeComponent.extendComponent({
class DialogWithBoardSwimlaneListAndCard extends BlazeComponent {
/** returns the checklist dialog options
* @return Object with properties { boardId, swimlaneId, listId, cardId }
*/
getChecklistDialogOptions() {
}
/** checklist is done
* @param cardId the selected card id
* @param options the selected options (Object with properties { boardId, swimlaneId, listId, cardId })
*/
setDone(cardId, options) {
}
onCreated() {
this.currentBoardId = Utils.getCurrentBoardId();
this.selectedBoardId = new ReactiveVar(this.currentBoardId);
this.selectedSwimlaneId = new ReactiveVar('');
this.selectedListId = new ReactiveVar('');
this.setMoveChecklistDialogOption(this.currentBoardId);
},
this.setChecklistDialogOption(this.currentBoardId);
}
/** set the last confirmed dialog field values
* @param boardId the current board id
*/
setMoveChecklistDialogOption(boardId) {
this.moveChecklistDialogOption = {
setChecklistDialogOption(boardId) {
this.checklistDialogOption = {
'boardId' : "",
'swimlaneId' : "",
'listId' : "",
'cardId': "",
}
let currentOptions = Meteor.user().getMoveChecklistDialogOptions();
let currentOptions = this.getChecklistDialogOptions();
if (currentOptions && boardId && currentOptions[boardId]) {
this.moveChecklistDialogOption = currentOptions[boardId];
if (this.moveChecklistDialogOption.boardId &&
this.moveChecklistDialogOption.swimlaneId &&
this.moveChecklistDialogOption.listId
this.checklistDialogOption = currentOptions[boardId];
if (this.checklistDialogOption.boardId &&
this.checklistDialogOption.swimlaneId &&
this.checklistDialogOption.listId
)
{
this.selectedBoardId.set(this.moveChecklistDialogOption.boardId)
this.selectedSwimlaneId.set(this.moveChecklistDialogOption.swimlaneId);
this.selectedListId.set(this.moveChecklistDialogOption.listId);
this.selectedBoardId.set(this.checklistDialogOption.boardId)
this.selectedSwimlaneId.set(this.checklistDialogOption.swimlaneId);
this.selectedListId.set(this.checklistDialogOption.listId);
}
}
this.getBoardData(boardId);
this.getBoardData(this.selectedBoardId.get());
if (!this.selectedSwimlaneId.get() || !Swimlanes.findOne({_id: this.selectedSwimlaneId.get(), boardId: this.selectedBoardId.get()})) {
this.setFirstSwimlaneId();
}
if (!this.selectedListId.get() || !Lists.findOne({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()})) {
this.setFirstListId();
}
},
}
/** sets the first swimlane id */
setFirstSwimlaneId() {
try {
@@ -426,7 +440,7 @@ BlazeComponent.extendComponent({
const swimlaneId = board.swimlanes().fetch()[0]._id;
this.selectedSwimlaneId.set(swimlaneId);
} catch (e) {}
},
}
/** sets the first list id */
setFirstListId() {
try {
@@ -434,44 +448,45 @@ BlazeComponent.extendComponent({
const listId = board.lists().fetch()[0]._id;
this.selectedListId.set(listId);
} catch (e) {}
},
}
/** returns if the board id was the last confirmed one
* @param boardId check this board id
* @return if the board id was the last confirmed one
*/
isMoveChecklistDialogOptionBoardId(boardId) {
let ret = this.moveChecklistDialogOption.boardId == boardId;
isChecklistDialogOptionBoardId(boardId) {
let ret = this.checklistDialogOption.boardId == boardId;
return ret;
},
}
/** returns if the swimlane id was the last confirmed one
* @param swimlaneId check this swimlane id
* @return if the swimlane id was the last confirmed one
*/
isMoveChecklistDialogOptionSwimlaneId(swimlaneId) {
let ret = this.moveChecklistDialogOption.swimlaneId == swimlaneId;
isChecklistDialogOptionSwimlaneId(swimlaneId) {
let ret = this.checklistDialogOption.swimlaneId == swimlaneId;
return ret;
},
}
/** returns if the list id was the last confirmed one
* @param listId check this list id
* @return if the list id was the last confirmed one
*/
isMoveChecklistDialogOptionListId(listId) {
let ret = this.moveChecklistDialogOption.listId == listId;
isChecklistDialogOptionListId(listId) {
let ret = this.checklistDialogOption.listId == listId;
return ret;
},
}
/** returns if the card id was the last confirmed one
* @param cardId check this card id
* @return if the card id was the last confirmed one
*/
isMoveChecklistDialogOptionCardId(cardId) {
let ret = this.moveChecklistDialogOption.cardId == cardId;
isChecklistDialogOptionCardId(cardId) {
let ret = this.checklistDialogOption.cardId == cardId;
return ret;
},
}
/** returns all available board */
boards() {
const ret = Boards.find(
{
@@ -484,25 +499,28 @@ BlazeComponent.extendComponent({
},
);
return ret;
},
}
/** returns all available swimlanes of the current board */
swimlanes() {
const board = Boards.findOne(this.selectedBoardId.get());
const ret = board.swimlanes();
return ret;
},
}
/** returns all available lists of the current board */
lists() {
const board = Boards.findOne(this.selectedBoardId.get());
const ret = board.lists();
return ret;
},
}
/** returns all available cards of the current list */
cards() {
const list = Lists.findOne(this.selectedListId.get());
const ret = list.cards(this.selectedSwimlaneId.get());
return ret;
},
}
/** get the board data from the server
* @param boardId get the board data of this board id
@@ -511,16 +529,19 @@ BlazeComponent.extendComponent({
const self = this;
Meteor.subscribe('board', boardId, false, {
onReady() {
const sameBoardId = self.selectedBoardId.get() == boardId;
self.selectedBoardId.set(boardId);
// reset swimlane id (for selection in cards())
self.setFirstSwimlaneId();
if (!sameBoardId) {
// reset swimlane id (for selection in cards())
self.setFirstSwimlaneId();
// reset list id (for selection in cards())
self.setFirstListId();
// reset list id (for selection in cards())
self.setFirstListId();
}
},
});
},
}
events() {
return [
@@ -544,8 +565,7 @@ BlazeComponent.extendComponent({
'listId' : listId,
'cardId': cardId,
}
Meteor.user().setMoveChecklistDialogOption(this.currentBoardId, options);
this.data().checklist.move(cardId);
this.setDone(cardId, options);
Popup.back(2);
},
'change .js-select-boards'(event) {
@@ -560,5 +580,29 @@ BlazeComponent.extendComponent({
},
},
];
},
}
}
/** Move Checklist Dialog */
(class extends DialogWithBoardSwimlaneListAndCard {
getChecklistDialogOptions() {
const ret = Meteor.user().getMoveChecklistDialogOptions();
return ret;
}
setDone(cardId, options) {
Meteor.user().setMoveChecklistDialogOption(this.currentBoardId, options);
this.data().checklist.move(cardId);
}
}).register('moveChecklistPopup');
/** Copy Checklist Dialog */
(class extends DialogWithBoardSwimlaneListAndCard {
getChecklistDialogOptions() {
const ret = Meteor.user().getCopyChecklistDialogOptions();
return ret;
}
setDone(cardId, options) {
Meteor.user().setCopyChecklistDialogOption(this.currentBoardId, options);
this.data().checklist.copy(cardId);
}
}).register('copyChecklistPopup');
+1 -1
View File
@@ -7,7 +7,7 @@ template(name="minicard")
.handle
.fa.fa-arrows
if cover
.minicard-cover(style="background-image: url('{{cover.url}}');")
.minicard-cover(style="background-image: url('{{cover.link 'original' '/'}}?dummyReloadAfterSessionEstablished={{sess}}');")
if labels
.minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}")
each labels
+6
View File
@@ -114,6 +114,12 @@ Template.minicard.helpers({
return false;
}
},
// XXX resolve this nasty hack for https://github.com/veliovgroup/Meteor-Files/issues/763
sess() {
return Meteor.connection && Meteor.connection._lastSessionId
? Meteor.connection._lastSessionId
: null;
},
});
BlazeComponent.extendComponent({
+2 -1
View File
@@ -4,7 +4,6 @@
box-sizing: border-box
display: flex
flex-direction: column
flex: 0 0 270px
position: relative
// Even if this background color is the same as the body we can't leave it
// transparent, because that won't work during a list drag.
@@ -12,6 +11,8 @@
border-left: 1px solid darken(white, 20%)
padding: 0
float: left
min-width: 270px
max-width: 270px
&:first-child
margin-left: 5px
+20 -41
View File
@@ -153,7 +153,6 @@ BlazeComponent.extendComponent({
});
}
},
onImageUpload(files) {
const $summernote = getSummernote(this);
if (files && files.length > 0) {
@@ -161,46 +160,26 @@ BlazeComponent.extendComponent({
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();
});
}
const processUpload = function(file) {
const uploader = Attachments.insert(
{
file,
meta: Utils.getCommonAttachmentMetaFrom(card),
chunkSize: 'dynamic',
},
false,
);
uploader.on('uploaded', (error, fileRef) => {
if (!error) {
if (fileRef.isImage) {
const img = document.createElement('img');
img.src = fileRef.link();
img.setAttribute('width', '100%');
$summernote.summernote('insertNode', img);
}
}
});
uploader.start();
};
if (MAX_IMAGE_PIXEL) {
const reader = new FileReader();
@@ -216,7 +195,7 @@ BlazeComponent.extendComponent({
callback(blob) {
if (blob !== false) {
blob.name = image.name;
processData(blob);
processUpload(blob);
}
},
});
@@ -224,7 +203,7 @@ BlazeComponent.extendComponent({
};
reader.readAsDataURL(image);
} else {
processData(image);
processUpload(image);
}
}
},
+1
View File
@@ -1,6 +1,7 @@
Meteor.subscribe('user-admin');
Meteor.subscribe('boards');
Meteor.subscribe('setting');
Meteor.subscribe('announcements');
Template.header.onCreated(function(){
const templateInstance = this;
templateInstance.currentSetting = new ReactiveVar();
+15
View File
@@ -53,6 +53,19 @@ Template.userFormsLayout.onCreated(function() {
$('.at-pwd-form').hide();
}
});
Meteor.call('isDisableRegistration', (_, result) => {
if (result) {
$('.at-signup-link').hide();
}
});
Meteor.call('isDisableForgotPassword', (_, result) => {
if (result) {
$('.at-pwd-link').hide();
}
});
});
Template.userFormsLayout.onRendered(() => {
@@ -182,6 +195,8 @@ Template.userFormsLayout.helpers({
name = 'español de Perú';
} else if (lang.name === 'Español de Puerto Rico') {
name = 'español de Puerto Rico';
} else if (lang.name === 'gl-ES') {
name = 'Galego (España)';
} else if (lang.name === 'oc') {
name = 'Occitan';
} else if (lang.name === 'ru-UA') {
+1 -1
View File
@@ -112,7 +112,7 @@
.trigger-item
overflow:auto
padding:10px
height:40px
height:100px
margin-bottom:5px
border-radius: 3px
position: relative
@@ -63,6 +63,11 @@ template(name="webhookSettings")
template(name="general")
ul#registration-setting.setting-detail
li
a.flex.js-toggle-forgot-password
.materialCheckBox(class="{{#if currentSetting.disableForgotPassword}}is-checked{{/if}}")
span {{_ 'disable-forgot-password'}}
li
a.flex.js-toggle-registration
.materialCheckBox(class="{{#if currentSetting.disableRegistration}}is-checked{{/if}}")
+11
View File
@@ -4,6 +4,7 @@ BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
this.forgotPasswordSetting = new ReactiveVar(true);
this.generalSetting = new ReactiveVar(true);
this.emailSetting = new ReactiveVar(false);
this.accountSetting = new ReactiveVar(false);
@@ -56,6 +57,14 @@ BlazeComponent.extendComponent({
},
);
},
toggleForgotPassword() {
this.setLoading(true);
const forgotPasswordClosed = this.currentSetting().disableForgotPassword;
Settings.update(Settings.findOne()._id, {
$set: { disableForgotPassword: !forgotPasswordClosed },
});
this.setLoading(false);
},
toggleRegistration() {
this.setLoading(true);
const registrationClosed = this.currentSetting().disableRegistration;
@@ -84,6 +93,7 @@ BlazeComponent.extendComponent({
$('.side-menu li.active').removeClass('active');
target.parent().addClass('active');
const targetID = target.data('id');
this.forgotPasswordSetting.set('forgot-password-setting' === targetID);
this.generalSetting.set('registration-setting' === targetID);
this.emailSetting.set('email-setting' === targetID);
this.accountSetting.set('account-setting' === targetID);
@@ -267,6 +277,7 @@ BlazeComponent.extendComponent({
events() {
return [
{
'click a.js-toggle-forgot-password': this.toggleForgotPassword,
'click a.js-toggle-registration': this.toggleRegistration,
'click a.js-toggle-tls': this.toggleTLS,
'click a.js-setting-menu': this.switchMenu,
+6
View File
@@ -203,6 +203,12 @@ template(name="boardCardSettingsPopup")
span
i.fa.fa-sort
| {{_ 'card-sorting-by-number'}}
div.check-div
a.flex.js-field-has-card-show-lists(class="{{#if allowsShowLists}}is-checked{{/if}}")
.materialCheckBox(class="{{#if allowsShowLists}}is-checked{{/if}}")
span
i.fa.fa-list
| {{_ 'card-show-lists'}}
div.check-div
a.flex.js-field-has-labels(class="{{#if allowsLabels}}is-checked{{/if}}")
.materialCheckBox(class="{{#if allowsLabels}}is-checked{{/if}}")
+20
View File
@@ -827,6 +827,10 @@ BlazeComponent.extendComponent({
return this.currentBoard.allowsCardSortingByNumber;
},
allowsShowLists() {
return this.currentBoard.allowsShowLists;
},
allowsLabels() {
return this.currentBoard.allowsLabels;
},
@@ -1061,6 +1065,22 @@ BlazeComponent.extendComponent({
this.currentBoard.allowsCardSortingByNumber,
);
},
'click .js-field-has-card-show-lists'(evt) {
evt.preventDefault();
this.currentBoard.allowsShowLists = !this.currentBoard
.allowsShowLists;
this.currentBoard.setAllowsShowLists(
this.currentBoard.allowsShowLists,
);
$(`.js-field-has-card-show-lists ${MCB}`).toggleClass(
CKCLS,
this.currentBoard.allowsShowLists,
);
$('.js-field-has-card-show-lists').toggleClass(
CKCLS,
this.currentBoard.allowsShowLists,
);
},
'click .js-field-has-labels'(evt) {
evt.preventDefault();
this.currentBoard.allowsLabels = !this.currentBoard.allowsLabels;
+2
View File
@@ -54,6 +54,7 @@ function initSortable(boardComponent, $listsDom) {
};
$listsDom.sortable({
connectWith: '.board-canvas',
tolerance: 'pointer',
helper: 'clone',
items: '.js-list:not(.js-list-composer)',
@@ -61,6 +62,7 @@ function initSortable(boardComponent, $listsDom) {
distance: 7,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
ui.placeholder.width(ui.helper.width());
EscapeActions.executeUpTo('popup-close');
boardComponent.setIsDragging(true);
},
@@ -36,6 +36,11 @@
// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
*/
@media screen and (min-width: 801px)
.swimlane.ui-sortable
// swimlane must have max width, otherwise lists are not sortable if there are too much lists and the swimlane "scrollable"
width: max-content
[class=swimlane]
position: sticky
left: 0
+2 -2
View File
@@ -85,7 +85,7 @@ template(name="changeAvatarPopup")
each uploadedAvatars
li: a.js-select-avatar
.member
img.avatar.avatar-image(src="{{url avatarUrlOptions}}")
img.avatar.avatar-image(src="{{link}}?auth=false&brokenIsFine=true")
| {{_ 'uploaded-avatar'}}
if isSelected
i.fa.fa-check
@@ -93,7 +93,7 @@ template(name="changeAvatarPopup")
unless isSelected
a.js-delete-avatar {{_ 'delete'}}
| -
= original.name
= name
li: a.js-select-initials
.member
+userAvatarInitials(userId=currentUser._id)
+24 -32
View File
@@ -3,6 +3,7 @@ import Avatars from '/models/avatars';
import Users from '/models/users';
import Org from '/models/org';
import Team from '/models/team';
import { formatFleURL } from 'meteor/ostrio:files/lib';
Template.userAvatar.helpers({
userData() {
@@ -181,21 +182,14 @@ BlazeComponent.extendComponent({
Meteor.subscribe('my-avatars');
},
avatarUrlOptions() {
return {
auth: false,
brokenIsFine: true,
};
},
uploadedAvatars() {
return Avatars.find({ userId: Meteor.userId() });
return Avatars.find({ userId: Meteor.userId() }).each();
},
isSelected() {
const userProfile = Meteor.user().profile;
const avatarUrl = userProfile && userProfile.avatarUrl;
const currentAvatarUrl = this.currentData().url(this.avatarUrlOptions());
const currentAvatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`;
return avatarUrl === currentAvatarUrl;
},
@@ -220,32 +214,30 @@ BlazeComponent.extendComponent({
this.$('.js-upload-avatar-input').click();
},
'change .js-upload-avatar-input'(event) {
let file, fileUrl;
FS.Utility.eachFile(event, f => {
try {
file = Avatars.insert(new FS.File(f));
fileUrl = file.url(this.avatarUrlOptions());
} catch (e) {
this.setError('avatar-too-big');
}
});
if (fileUrl) {
this.setError('');
const fetchAvatarInterval = window.setInterval(() => {
$.ajax({
url: fileUrl,
success: () => {
this.setAvatar(file.url(this.avatarUrlOptions()));
window.clearInterval(fetchAvatarInterval);
},
});
}, 100);
const self = this;
if (event.currentTarget.files && event.currentTarget.files[0]) {
const uploader = Avatars.insert(
{
file: event.currentTarget.files[0],
chunkSize: 'dynamic',
},
false,
);
uploader.on('uploaded', (error, fileRef) => {
if (!error) {
self.setAvatar(
`${formatFleURL(fileRef)}?auth=false&brokenIsFine=true`,
);
}
});
uploader.on('error', (error, fileData) => {
self.setError(error.reason);
});
uploader.start();
}
},
'click .js-select-avatar'() {
const avatarUrl = this.currentData().url(this.avatarUrlOptions());
const avatarUrl = `${this.currentData().link()}?auth=false&brokenIsFine=true`;
this.setAvatar(avatarUrl);
},
'click .js-select-initials'() {
+2
View File
@@ -329,6 +329,8 @@ Template.changeLanguagePopup.helpers({
name = 'español de Perú';
} else if (lang.name === 'Español de Puerto Rico') {
name = 'español de Puerto Rico';
} else if (lang.name === 'gl-ES') {
name = 'Galego (España)';
} else if (lang.name === 'oc') {
name = 'Occitan';
} else if (lang.name === 'ru-UA') {
+70 -1
View File
@@ -8,7 +8,7 @@ function getHoveredCardId() {
}
function getSelectedCardId() {
return Session.get('selectedCard') || getHoveredCardId();
return Session.get('currentCard') || Session.get('selectedCard') || getHoveredCardId();
}
Mousetrap.bind('?', () => {
@@ -68,6 +68,67 @@ Mousetrap.bind(['down', 'up'], (evt, key) => {
}
});
numbArray = _.range(1,10).map(x => 'shift+'+String(x))
Mousetrap.bind(numbArray, (evt, key) => {
num = parseInt(key.substr(6, key.length));
const currentUserId = Meteor.userId();
if (currentUserId === null) {
return;
}
const currentBoardId = Session.get('currentBoard');
board = Boards.findOne(currentBoardId);
labels = board.labels;
if(MultiSelection.isActive())
{
const cardIds = MultiSelection.getSelectedCardIds();
for (const cardId of cardIds)
{
card = Cards.findOne(cardId);
if(num <= board.labels.length)
{
card.removeLabel(labels[num-1]["_id"]);
}
}
}
});
numArray = _.range(1,10).map(x => String(x))
Mousetrap.bind(numArray, (evt, key) => {
num = parseInt(key);
const currentUserId = Meteor.userId();
const currentBoardId = Session.get('currentBoard');
if (currentUserId === null) {
return;
}
board = Boards.findOne(currentBoardId);
labels = board.labels;
if(MultiSelection.isActive() && Meteor.user().isBoardMember())
{
const cardIds = MultiSelection.getSelectedCardIds();
for (const cardId of cardIds)
{
card = Cards.findOne(cardId);
if(num <= board.labels.length)
{
card.addLabel(labels[num-1]["_id"]);
}
}
return;
}
const cardId = getSelectedCardId();
if (!cardId) {
return;
}
if (Meteor.user().isBoardMember()) {
const card = Cards.findOne(cardId);
if(num <= board.labels.length)
{
card.toggleLabel(labels[num-1]["_id"]);
}
}
});
Mousetrap.bind('space', evt => {
const cardId = getSelectedCardId();
if (!cardId) {
@@ -154,5 +215,13 @@ Template.keyboardShortcuts.helpers({
keys: ['c'],
action: 'archive-card',
},
{
keys: ['number keys 1-9'],
action: 'toggle-labels'
},
{
keys: ['shift + number keys 1-9'],
action: 'remove-labels-multiselect'
},
],
});
+3
View File
@@ -83,6 +83,9 @@ MultiSelection = {
isEmpty() {
return this.count() === 0;
},
getSelectedCardIds(){
return this._selectedCards.curValue;
},
activate() {
if (!this.isActive()) {
+13 -25
View File
@@ -162,33 +162,21 @@ Utils = {
})
);
},
getCommonAttachmentMetaFrom(card) {
const meta = {};
if (card.isLinkedCard()) {
meta.boardId = Cards.findOne(card.linkedId).boardId;
meta.cardId = card.linkedId;
} else {
meta.boardId = card.boardId;
meta.swimlaneId = card.swimlaneId;
meta.listId = card.listId;
meta.cardId = card._id;
}
return meta;
},
MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL,
COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO,
processUploadedAttachment(card, fileObj, callback) {
const next = attachment => {
if (typeof callback === 'function') {
callback(attachment);
}
};
if (!card) {
return next();
}
const file = new FS.File(fileObj);
if (card.isLinkedCard()) {
file.boardId = Cards.findOne(card.linkedId).boardId;
file.cardId = card.linkedId;
} else {
file.boardId = card.boardId;
file.swimlaneId = card.swimlaneId;
file.listId = card.listId;
file.cardId = card._id;
}
file.userId = Meteor.userId();
if (file.original) {
file.original.name = fileObj.name;
}
return next(Attachments.insert(file));
},
shrinkImage(options) {
// shrink image to certain size
const dataurl = options.dataurl,
+42 -4
View File
@@ -1,5 +1,32 @@
const passwordField = AccountsTemplates.removeField('password');
const emailField = AccountsTemplates.removeField('email');
let disableRegistration = false;
let disableForgotPassword = false;
let passwordLoginDisabled = false;
Meteor.call('isPasswordLoginDisabled', (_, result) => {
if (result) {
passwordLoginDisabled = true;
//console.log('passwordLoginDisabled');
//console.log(result);
}
});
Meteor.call('isDisableRegistration', (_, result) => {
if (result) {
disableRegistration = true;
//console.log('disableRegistration');
//console.log(result);
}
});
Meteor.call('isDisableForgotPassword', (_, result) => {
if (result) {
disableForgotPassword = true;
//console.log('disableForgotPassword');
//console.log(result);
}
});
AccountsTemplates.addFields([
{
@@ -27,7 +54,8 @@ AccountsTemplates.configure({
confirmPassword: true,
enablePasswordChange: true,
sendVerificationEmail: true,
showForgotPasswordLink: true,
showForgotPasswordLink: !disableForgotPassword,
forbidClientAccountCreation: disableRegistration,
onLogoutHook() {
const homePage = 'home';
if (FlowRouter.getRouteName() === homePage) {
@@ -38,11 +66,21 @@ AccountsTemplates.configure({
},
});
if (!disableForgotPassword) {
[
'forgotPwd',
'resetPwd',
].forEach(routeName => AccountsTemplates.configureRoute(routeName));
}
if (!disableRegistration) {
[
'signUp',
].forEach(routeName => AccountsTemplates.configureRoute(routeName));
}
[
'signIn',
'signUp',
'resetPwd',
'forgotPwd',
'enrollAccount',
].forEach(routeName => AccountsTemplates.configureRoute(routeName));
+10 -4
View File
@@ -174,6 +174,12 @@ services:
#- MAIL_SERVICE_USER=firstname.lastname@hotmail.com
#- MAIL_SERVICE_PASSWORD=SecretPassword
#---------------------------------------------------------------
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
# Add more Node heap, this is done by default at Dockerfile:
# - NODE_OPTIONS="--max_old_space_size=4096"
# Add more stack, this is done at Dockerfile:
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
#---------------------------------------------------------------
# ==== OPTIONAL: MONGO OPLOG SETTINGS =====
# https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-378343587
# We've fixed our CPU usage problem today with an environment
@@ -241,10 +247,6 @@ services:
# 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> # pathname can be relative or fullpath
#---------------------------------------------------------------
# ==== RICH TEXT EDITOR IN CARD COMMENTS ====
# https://github.com/wekan/wekan/pull/2560
- RICHER_CARD_COMMENT_EDITOR=false
@@ -323,6 +325,9 @@ services:
# When browser policy is enabled, HTML code at this Trusted URL can have iframe that embeds Wekan inside.
#- TRUSTED_URL=https://intra.example.com
#-----------------------------------------------------------------
# ==== WRITEABLE PATH FOR FILE UPLOADS ====
- WRITABLE_PATH=/data
#-----------------------------------------------------------------
# ==== OUTGOING WEBHOOKS ====
# What to send to Outgoing Webhook, or leave out. If commented out the default values will be: cardId,listId,oldListId,boardId,comment,user,card,commentId,swimlaneId,customerField,customFieldValue
#- WEBHOOKS_ATTRIBUTES=cardId,listId,oldListId,boardId,comment,user,card,commentId
@@ -668,6 +673,7 @@ services:
- wekandb
volumes:
- /etc/localtime:/etc/localtime:ro
- ./volumes/data:/data
#---------------------------------------------------------------------------------
# ==== OPTIONAL: SHARE DATABASE TO OFFICE LAN AND REMOTE VPN ====
-914
View File
@@ -1,914 +0,0 @@
(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var global = Package.meteor.global;
var meteorEnv = Package.meteor.meteorEnv;
var FS = Package['wekan-cfs-base-package'].FS;
var check = Package.check.check;
var Match = Package.check.Match;
var EJSON = Package.ejson.EJSON;
var HTTP = Package['wekan-cfs-http-methods'].HTTP;
/* Package-scope variables */
var rootUrlPathPrefix, baseUrl, getHeaders, getHeadersByCollection, _existingMountPoints, mountUrls;
(function(){
///////////////////////////////////////////////////////////////////////
// //
// packages/cfs_access-point/packages/cfs_access-point.js //
// //
///////////////////////////////////////////////////////////////////////
//
(function () {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/wekan-cfs-access-point/access-point-common.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
rootUrlPathPrefix = __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || ""; // 1
// Adjust the rootUrlPathPrefix if necessary // 2
if (rootUrlPathPrefix.length > 0) { // 3
if (rootUrlPathPrefix.slice(0, 1) !== '/') { // 4
rootUrlPathPrefix = '/' + rootUrlPathPrefix; // 5
} // 6
if (rootUrlPathPrefix.slice(-1) === '/') { // 7
rootUrlPathPrefix = rootUrlPathPrefix.slice(0, -1); // 8
} // 9
} // 10
// 11
// prepend ROOT_URL when isCordova // 12
if (Meteor.isCordova) { // 13
rootUrlPathPrefix = Meteor.absoluteUrl(rootUrlPathPrefix.replace(/^\/+/, '')).replace(/\/+$/, ''); // 14
} // 15
// 16
baseUrl = '/cfs'; // 17
FS.HTTP = FS.HTTP || {}; // 18
// 19
// Note the upload URL so that client uploader packages know what it is // 20
FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; // 21
// 22
/** // 23
* @method FS.HTTP.setBaseUrl // 24
* @public // 25
* @param {String} newBaseUrl - Change the base URL for the HTTP GET and DELETE endpoints. // 26
* @returns {undefined} // 27
*/ // 28
FS.HTTP.setBaseUrl = function setBaseUrl(newBaseUrl) { // 29
// 30
// Adjust the baseUrl if necessary // 31
if (newBaseUrl.slice(0, 1) !== '/') { // 32
newBaseUrl = '/' + newBaseUrl; // 33
} // 34
if (newBaseUrl.slice(-1) === '/') { // 35
newBaseUrl = newBaseUrl.slice(0, -1); // 36
} // 37
// 38
// Update the base URL // 39
baseUrl = newBaseUrl; // 40
// 41
// Change the upload URL so that client uploader packages know what it is // 42
FS.HTTP.uploadUrl = rootUrlPathPrefix + baseUrl + '/files'; // 43
// 44
// Remount URLs with the new baseUrl, unmounting the old, on the server only. // 45
// If existingMountPoints is empty, then we haven't run the server startup // 46
// code yet, so this new URL will be used at that point for the initial mount. // 47
if (Meteor.isServer && !FS.Utility.isEmpty(_existingMountPoints)) { // 48
mountUrls(); // 49
} // 50
}; // 51
// 52
/* // 53
* FS.File extensions // 54
*/ // 55
// 56
/** // 57
* @method FS.File.prototype.url Construct the file url // 58
* @public // 59
* @param {Object} [options] // 60
* @param {String} [options.store] Name of the store to get from. If not defined, the first store defined in `options.stores` for the collection on the client is used.
* @param {Boolean} [options.auth=null] Add authentication token to the URL query string? By default, a token for the current logged in user is added on the client. Set this to `false` to omit the token. Set this to a string to provide your own token. Set this to a number to specify an expiration time for the token in seconds.
* @param {Boolean} [options.download=false] Should headers be set to force a download? Typically this means that clicking the link with this URL will download the file to the user's Downloads folder instead of displaying the file in the browser.
* @param {Boolean} [options.brokenIsFine=false] Return the URL even if we know it's currently a broken link because the file hasn't been saved in the requested store yet.
* @param {Boolean} [options.metadata=false] Return the URL for the file metadata access point rather than the file itself.
* @param {String} [options.uploading=null] A URL to return while the file is being uploaded. // 66
* @param {String} [options.storing=null] A URL to return while the file is being stored. // 67
* @param {String} [options.filename=null] Override the filename that should appear at the end of the URL. By default it is the name of the file in the requested store.
* // 69
* Returns the HTTP URL for getting the file or its metadata. // 70
*/ // 71
FS.File.prototype.url = function(options) { // 72
var self = this; // 73
options = options || {}; // 74
options = FS.Utility.extend({ // 75
store: null, // 76
auth: null, // 77
download: false, // 78
metadata: false, // 79
brokenIsFine: false, // 80
uploading: null, // return this URL while uploading // 81
storing: null, // return this URL while storing // 82
filename: null // override the filename that is shown to the user // 83
}, options.hash || options); // check for "hash" prop if called as helper // 84
// 85
// Primarily useful for displaying a temporary image while uploading an image // 86
if (options.uploading && !self.isUploaded()) { // 87
return options.uploading; // 88
} // 89
// 90
if (self.isMounted()) { // 91
// See if we've stored in the requested store yet // 92
var storeName = options.store || self.collection.primaryStore.name; // 93
if (!self.hasStored(storeName)) { // 94
if (options.storing) { // 95
return options.storing; // 96
} else if (!options.brokenIsFine) { // 97
// We want to return null if we know the URL will be a broken // 98
// link because then we can avoid rendering broken links, broken // 99
// images, etc. // 100
return null; // 101
} // 102
} // 103
// 104
// Add filename to end of URL if we can determine one // 105
var filename = options.filename || self.name({store: storeName}); // 106
if (typeof filename === "string" && filename.length) { // 107
filename = '/' + filename; // 108
} else { // 109
filename = ''; // 110
} // 111
// 112
// TODO: Could we somehow figure out if the collection requires login? // 113
var authToken = ''; // 114
if (Meteor.isClient && typeof Accounts !== "undefined" && typeof Accounts._storedLoginToken === "function") { // 115
if (options.auth !== false) { // 116
// Add reactive deps on the user // 117
Meteor.userId(); // 118
// 119
var authObject = { // 120
authToken: Accounts._storedLoginToken() || '' // 121
}; // 122
// 123
// If it's a number, we use that as the expiration time (in seconds) // 124
if (options.auth === +options.auth) { // 125
authObject.expiration = FS.HTTP.now() + options.auth * 1000; // 126
} // 127
// 128
// Set the authToken // 129
var authString = JSON.stringify(authObject); // 130
authToken = FS.Utility.btoa(authString); // 131
} // 132
} else if (typeof options.auth === "string") { // 133
// If the user supplies auth token the user will be responsible for // 134
// updating // 135
authToken = options.auth; // 136
} // 137
// 138
// Construct query string // 139
var params = {}; // 140
if (authToken !== '') { // 141
params.token = authToken; // 142
} // 143
if (options.download) { // 144
params.download = true; // 145
} // 146
if (options.store) { // 147
// We use options.store here instead of storeName because we want to omit the queryString // 148
// whenever possible, allowing users to have "clean" URLs if they want. The server will // 149
// assume the first store defined on the server, which means that we are assuming that // 150
// the first on the client is also the first on the server. If that's not the case, the // 151
// store option should be supplied. // 152
params.store = options.store; // 153
} // 154
var queryString = FS.Utility.encodeParams(params); // 155
if (queryString.length) { // 156
queryString = '?' + queryString; // 157
} // 158
// 159
// Determine which URL to use // 160
var area; // 161
if (options.metadata) { // 162
area = '/record'; // 163
} else { // 164
area = '/files'; // 165
} // 166
// 167
// Construct and return the http method url // 168
return rootUrlPathPrefix + baseUrl + area + '/' + self.collection.name + '/' + self._id + filename + queryString; // 169
} // 170
// 171
}; // 172
// 173
// 174
// 175
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function () {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/wekan-cfs-access-point/access-point-handlers.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
getHeaders = []; // 1
getHeadersByCollection = {}; // 2
// 3
FS.HTTP.Handlers = {}; // 4
// 5
/** // 6
* @method FS.HTTP.Handlers.Del // 7
* @public // 8
* @returns {any} response // 9
* // 10
* HTTP DEL request handler // 11
*/ // 12
FS.HTTP.Handlers.Del = function httpDelHandler(ref) { // 13
var self = this; // 14
var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 15
// 16
// If DELETE request, validate with 'remove' allow/deny, delete the file, and return // 17
FS.Utility.validateAction(ref.collection.files._validators['remove'], ref.file, self.userId); // 18
// 19
/* // 20
* From the DELETE spec: // 21
* A successful response SHOULD be 200 (OK) if the response includes an // 22
* entity describing the status, 202 (Accepted) if the action has not // 23
* yet been enacted, or 204 (No Content) if the action has been enacted // 24
* but the response does not include an entity. // 25
*/ // 26
self.setStatusCode(200); // 27
// 28
return { // 29
deleted: !!ref.file.remove() // 30
}; // 31
}; // 32
// 33
/** // 34
* @method FS.HTTP.Handlers.GetList // 35
* @public // 36
* @returns {Object} response // 37
* // 38
* HTTP GET file list request handler // 39
*/ // 40
FS.HTTP.Handlers.GetList = function httpGetListHandler() { // 41
// Not Yet Implemented // 42
// Need to check publications and return file list based on // 43
// what user is allowed to see // 44
}; // 45
// 46
/* // 47
requestRange will parse the range set in request header - if not possible it // 48
will throw fitting errors and autofill range for both partial and full ranges // 49
// 50
throws error or returns the object: // 51
{ // 52
start // 53
end // 54
length // 55
unit // 56
partial // 57
} // 58
*/ // 59
var requestRange = function(req, fileSize) { // 60
if (req) { // 61
if (req.headers) { // 62
var rangeString = req.headers.range; // 63
// 64
// Make sure range is a string // 65
if (rangeString === ''+rangeString) { // 66
// 67
// range will be in the format "bytes=0-32767" // 68
var parts = rangeString.split('='); // 69
var unit = parts[0]; // 70
// 71
// Make sure parts consists of two strings and range is of type "byte" // 72
if (parts.length == 2 && unit == 'bytes') { // 73
// Parse the range // 74
var range = parts[1].split('-'); // 75
var start = Number(range[0]); // 76
var end = Number(range[1]); // 77
// 78
// Fix invalid ranges? // 79
if (range[0] != start) start = 0; // 80
if (range[1] != end || !end) end = fileSize - 1; // 81
// 82
// Make sure range consists of a start and end point of numbers and start is less than end // 83
if (start < end) { // 84
// 85
var partSize = 0 - start + end + 1; // 86
// 87
// Return the parsed range // 88
return { // 89
start: start, // 90
end: end, // 91
length: partSize, // 92
size: fileSize, // 93
unit: unit, // 94
partial: (partSize < fileSize) // 95
}; // 96
// 97
} else { // 98
throw new Meteor.Error(416, "Requested Range Not Satisfiable"); // 99
} // 100
// 101
} else { // 102
// The first part should be bytes // 103
throw new Meteor.Error(416, "Requested Range Unit Not Satisfiable"); // 104
} // 105
// 106
} else { // 107
// No range found // 108
} // 109
// 110
} else { // 111
// throw new Error('No request headers set for _parseRange function'); // 112
} // 113
} else { // 114
throw new Error('No request object passed to _parseRange function'); // 115
} // 116
// 117
return { // 118
start: 0, // 119
end: fileSize - 1, // 120
length: fileSize, // 121
size: fileSize, // 122
unit: 'bytes', // 123
partial: false // 124
}; // 125
}; // 126
// 127
/** // 128
* @method FS.HTTP.Handlers.Get // 129
* @public // 130
* @returns {any} response // 131
* // 132
* HTTP GET request handler // 133
*/ // 134
FS.HTTP.Handlers.Get = function httpGetHandler(ref) { // 135
var self = this; // 136
// Once we have the file, we can test allow/deny validators // 137
// XXX: pass on the "share" query eg. ?share=342hkjh23ggj for shared url access? // 138
FS.Utility.validateAction(ref.collection._validators['download'], ref.file, self.userId /*, self.query.shareId*/); // 139
// 140
var storeName = ref.storeName; // 141
// 142
// If no storeName was specified, use the first defined storeName // 143
if (typeof storeName !== "string") { // 144
// No store handed, we default to primary store // 145
storeName = ref.collection.primaryStore.name; // 146
} // 147
// 148
// Get the storage reference // 149
var storage = ref.collection.storesLookup[storeName]; // 150
// 151
if (!storage) { // 152
throw new Meteor.Error(404, "Not Found", 'There is no store "' + storeName + '"'); // 153
} // 154
// 155
// Get the file // 156
var copyInfo = ref.file.copies[storeName]; // 157
// 158
if (!copyInfo) { // 159
throw new Meteor.Error(404, "Not Found", 'This file was not stored in the ' + storeName + ' store'); // 160
} // 161
// 162
// Set the content type for file // 163
if (typeof copyInfo.type === "string") { // 164
self.setContentType(copyInfo.type); // 165
} else { // 166
self.setContentType('application/octet-stream'); // 167
} // 168
// 169
// Add 'Content-Disposition' header if requested a download/attachment URL // 170
if (typeof ref.download !== "undefined") { // 171
var filename = ref.filename || copyInfo.name; // 172
self.addHeader('Content-Disposition', 'attachment; filename="' + filename + '"'); // 173
} else { // 174
self.addHeader('Content-Disposition', 'inline'); // 175
} // 176
// 177
// Get the contents range from request // 178
var range = requestRange(self.request, copyInfo.size); // 179
// 180
// Some browsers cope better if the content-range header is // 181
// still included even for the full file being returned. // 182
self.addHeader('Content-Range', range.unit + ' ' + range.start + '-' + range.end + '/' + range.size); // 183
// 184
// If a chunk/range was requested instead of the whole file, serve that' // 185
if (range.partial) { // 186
self.setStatusCode(206, 'Partial Content'); // 187
} else { // 188
self.setStatusCode(200, 'OK'); // 189
} // 190
// 191
// Add any other global custom headers and collection-specific custom headers // 192
FS.Utility.each(getHeaders.concat(getHeadersByCollection[ref.collection.name] || []), function(header) { // 193
self.addHeader(header[0], header[1]); // 194
}); // 195
// 196
// Inform clients about length (or chunk length in case of ranges) // 197
self.addHeader('Content-Length', range.length); // 198
// 199
// Last modified header (updatedAt from file info) // 200
self.addHeader('Last-Modified', copyInfo.updatedAt.toUTCString()); // 201
// 202
// Inform clients that we accept ranges for resumable chunked downloads // 203
self.addHeader('Accept-Ranges', range.unit); // 204
// 205
if (FS.debug) console.log('Read file "' + (ref.filename || copyInfo.name) + '" ' + range.unit + ' ' + range.start + '-' + range.end + '/' + range.size);
// 207
var readStream = storage.adapter.createReadStream(ref.file, {start: range.start, end: range.end}); // 208
// 209
readStream.on('error', function(err) { // 210
// Send proper error message on get error // 211
if (err.message && err.statusCode) { // 212
self.Error(new Meteor.Error(err.statusCode, err.message)); // 213
} else { // 214
self.Error(new Meteor.Error(503, 'Service unavailable')); // 215
} // 216
}); // 217
// 218
readStream.pipe(self.createWriteStream()); // 219
}; // 220
const originalHandler = FS.HTTP.Handlers.Get;
FS.HTTP.Handlers.Get = function (ref) {
//console.log(ref.filename);
try {
var userAgent = (this.requestHeaders['user-agent']||'').toLowerCase();
if(userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0 || userAgent.indexOf('chrome') >= 0) {
ref.filename = encodeURIComponent(ref.filename);
} else if(userAgent.indexOf('firefox') >= 0) {
ref.filename = Buffer.from(ref.filename).toString('binary');
} else {
/* safari*/
ref.filename = Buffer.from(ref.filename).toString('binary');
}
} catch (ex){
ref.filename = 'tempfix';
}
return originalHandler.call(this, ref);
};
// 221
/** // 222
* @method FS.HTTP.Handlers.PutInsert // 223
* @public // 224
* @returns {Object} response object with _id property // 225
* // 226
* HTTP PUT file insert request handler // 227
*/ // 228
FS.HTTP.Handlers.PutInsert = function httpPutInsertHandler(ref) { // 229
var self = this; // 230
var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 231
// 232
FS.debug && console.log("HTTP PUT (insert) handler"); // 233
// 234
// Create the nice FS.File // 235
var fileObj = new FS.File(); // 236
// 237
// Set its name // 238
fileObj.name(opts.filename || null); // 239
// 240
// Attach the readstream as the file's data // 241
fileObj.attachData(self.createReadStream(), {type: self.requestHeaders['content-type'] || 'application/octet-stream'});
// 243
// Validate with insert allow/deny // 244
FS.Utility.validateAction(ref.collection.files._validators['insert'], fileObj, self.userId); // 245
// 246
// Insert file into collection, triggering readStream storage // 247
ref.collection.insert(fileObj); // 248
// 249
// Send response // 250
self.setStatusCode(200); // 251
// 252
// Return the new file id // 253
return {_id: fileObj._id}; // 254
}; // 255
// 256
/** // 257
* @method FS.HTTP.Handlers.PutUpdate // 258
* @public // 259
* @returns {Object} response object with _id and chunk properties // 260
* // 261
* HTTP PUT file update chunk request handler // 262
*/ // 263
FS.HTTP.Handlers.PutUpdate = function httpPutUpdateHandler(ref) { // 264
var self = this; // 265
var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 266
// 267
var chunk = parseInt(opts.chunk, 10); // 268
if (isNaN(chunk)) chunk = 0; // 269
// 270
FS.debug && console.log("HTTP PUT (update) handler received chunk: ", chunk); // 271
// 272
// Validate with insert allow/deny; also mounts and retrieves the file // 273
FS.Utility.validateAction(ref.collection.files._validators['insert'], ref.file, self.userId); // 274
// 275
self.createReadStream().pipe( FS.TempStore.createWriteStream(ref.file, chunk) ); // 276
// 277
// Send response // 278
self.setStatusCode(200); // 279
// 280
return { _id: ref.file._id, chunk: chunk }; // 281
}; // 282
// 283
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
(function () {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/wekan-cfs-access-point/access-point-server.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var path = Npm.require("path"); // 1
// 2
HTTP.publishFormats({ // 3
fileRecordFormat: function (input) { // 4
// Set the method scope content type to json // 5
this.setContentType('application/json'); // 6
if (FS.Utility.isArray(input)) { // 7
return EJSON.stringify(FS.Utility.map(input, function (obj) { // 8
return FS.Utility.cloneFileRecord(obj); // 9
})); // 10
} else { // 11
return EJSON.stringify(FS.Utility.cloneFileRecord(input)); // 12
} // 13
} // 14
}); // 15
// 16
/** // 17
* @method FS.HTTP.setHeadersForGet // 18
* @public // 19
* @param {Array} headers - List of headers, where each is a two-item array in which item 1 is the header name and item 2 is the header value.
* @param {Array|String} [collections] - Which collections the headers should be added for. Omit this argument to add the header for all collections.
* @returns {undefined} // 22
*/ // 23
FS.HTTP.setHeadersForGet = function setHeadersForGet(headers, collections) { // 24
if (typeof collections === "string") { // 25
collections = [collections]; // 26
} // 27
if (collections) { // 28
FS.Utility.each(collections, function(collectionName) { // 29
getHeadersByCollection[collectionName] = headers || []; // 30
}); // 31
} else { // 32
getHeaders = headers || []; // 33
} // 34
}; // 35
// 36
/** // 37
* @method FS.HTTP.publish // 38
* @public // 39
* @param {FS.Collection} collection // 40
* @param {Function} func - Publish function that returns a cursor. // 41
* @returns {undefined} // 42
* // 43
* Publishes all documents returned by the cursor at a GET URL // 44
* with the format baseUrl/record/collectionName. The publish // 45
* function `this` is similar to normal `Meteor.publish`. // 46
*/ // 47
FS.HTTP.publish = function fsHttpPublish(collection, func) { // 48
var name = baseUrl + '/record/' + collection.name; // 49
// Mount collection listing URL using http-publish package // 50
HTTP.publish({ // 51
name: name, // 52
defaultFormat: 'fileRecordFormat', // 53
collection: collection, // 54
collectionGet: true, // 55
collectionPost: false, // 56
documentGet: true, // 57
documentPut: false, // 58
documentDelete: false // 59
}, func); // 60
// 61
FS.debug && console.log("Registered HTTP method GET URLs:\n\n" + name + '\n' + name + '/:id\n'); // 62
}; // 63
// 64
/** // 65
* @method FS.HTTP.unpublish // 66
* @public // 67
* @param {FS.Collection} collection // 68
* @returns {undefined} // 69
* // 70
* Unpublishes a restpoint created by a call to `FS.HTTP.publish` // 71
*/ // 72
FS.HTTP.unpublish = function fsHttpUnpublish(collection) { // 73
// Mount collection listing URL using http-publish package // 74
HTTP.unpublish(baseUrl + '/record/' + collection.name); // 75
}; // 76
// 77
_existingMountPoints = {}; // 78
// 79
/** // 80
* @method defaultSelectorFunction // 81
* @private // 82
* @returns { collection, file } // 83
* // 84
* This is the default selector function // 85
*/ // 86
var defaultSelectorFunction = function() { // 87
var self = this; // 88
// Selector function // 89
// // 90
// This function will have to return the collection and the // 91
// file. If file not found undefined is returned - if null is returned the // 92
// search was not possible // 93
var opts = FS.Utility.extend({}, self.query || {}, self.params || {}); // 94
// 95
// Get the collection name from the url // 96
var collectionName = opts.collectionName; // 97
// 98
// Get the id from the url // 99
var id = opts.id; // 100
// 101
// Get the collection // 102
var collection = FS._collections[collectionName]; // 103
// 104
// Get the file if possible else return null // 105
var file = (id && collection)? collection.findOne({ _id: id }): null; // 106
// 107
// Return the collection and the file // 108
return { // 109
collection: collection, // 110
file: file, // 111
storeName: opts.store, // 112
download: opts.download, // 113
filename: opts.filename // 114
}; // 115
}; // 116
// 117
/* // 118
* @method FS.HTTP.mount // 119
* @public // 120
* @param {array of string} mountPoints mount points to map rest functinality on // 121
* @param {function} selector_f [selector] function returns `{ collection, file }` for mount points to work with // 122
* // 123
*/ // 124
FS.HTTP.mount = function(mountPoints, selector_f) { // 125
// We take mount points as an array and we get a selector function // 126
var selectorFunction = selector_f || defaultSelectorFunction; // 127
// 128
var accessPoint = { // 129
'stream': true, // 130
'auth': expirationAuth, // 131
'post': function(data) { // 132
// Use the selector for finding the collection and file reference // 133
var ref = selectorFunction.call(this); // 134
// 135
// We dont support post - this would be normal insert eg. of filerecord? // 136
throw new Meteor.Error(501, "Not implemented", "Post is not supported"); // 137
}, // 138
'put': function(data) { // 139
// Use the selector for finding the collection and file reference // 140
var ref = selectorFunction.call(this); // 141
// 142
// Make sure we have a collection reference // 143
if (!ref.collection) // 144
throw new Meteor.Error(404, "Not Found", "No collection found"); // 145
// 146
// Make sure we have a file reference // 147
if (ref.file === null) { // 148
// No id supplied so we will create a new FS.File instance and // 149
// insert the supplied data. // 150
return FS.HTTP.Handlers.PutInsert.apply(this, [ref]); // 151
} else { // 152
if (ref.file) { // 153
return FS.HTTP.Handlers.PutUpdate.apply(this, [ref]); // 154
} else { // 155
throw new Meteor.Error(404, "Not Found", 'No file found'); // 156
} // 157
} // 158
}, // 159
'get': function(data) { // 160
// Use the selector for finding the collection and file reference // 161
var ref = selectorFunction.call(this); // 162
// 163
// Make sure we have a collection reference // 164
if (!ref.collection) // 165
throw new Meteor.Error(404, "Not Found", "No collection found"); // 166
// 167
// Make sure we have a file reference // 168
if (ref.file === null) { // 169
// No id supplied so we will return the published list of files ala // 170
// http.publish in json format // 171
return FS.HTTP.Handlers.GetList.apply(this, [ref]); // 172
} else { // 173
if (ref.file) { // 174
return FS.HTTP.Handlers.Get.apply(this, [ref]); // 175
} else { // 176
throw new Meteor.Error(404, "Not Found", 'No file found'); // 177
} // 178
} // 179
}, // 180
'delete': function(data) { // 181
// Use the selector for finding the collection and file reference // 182
var ref = selectorFunction.call(this); // 183
// 184
// Make sure we have a collection reference // 185
if (!ref.collection) // 186
throw new Meteor.Error(404, "Not Found", "No collection found"); // 187
// 188
// Make sure we have a file reference // 189
if (ref.file) { // 190
return FS.HTTP.Handlers.Del.apply(this, [ref]); // 191
} else { // 192
throw new Meteor.Error(404, "Not Found", 'No file found'); // 193
} // 194
} // 195
}; // 196
// 197
var accessPoints = {}; // 198
// 199
// Add debug message // 200
FS.debug && console.log('Registered HTTP method URLs:'); // 201
// 202
FS.Utility.each(mountPoints, function(mountPoint) { // 203
// Couple mountpoint and accesspoint // 204
accessPoints[mountPoint] = accessPoint; // 205
// Remember our mountpoints // 206
_existingMountPoints[mountPoint] = mountPoint; // 207
// Add debug message // 208
FS.debug && console.log(mountPoint); // 209
}); // 210
// 211
// XXX: HTTP:methods should unmount existing mounts in case of overwriting? // 212
HTTP.methods(accessPoints); // 213
// 214
}; // 215
// 216
/** // 217
* @method FS.HTTP.unmount // 218
* @public // 219
* @param {string | array of string} [mountPoints] Optional, if not specified all mountpoints are unmounted // 220
* // 221
*/ // 222
FS.HTTP.unmount = function(mountPoints) { // 223
// The mountPoints is optional, can be string or array if undefined then // 224
// _existingMountPoints will be used // 225
var unmountList; // 226
// Container for the mount points to unmount // 227
var unmountPoints = {}; // 228
// 229
if (typeof mountPoints === 'undefined') { // 230
// Use existing mount points - unmount all // 231
unmountList = _existingMountPoints; // 232
} else if (mountPoints === ''+mountPoints) { // 233
// Got a string // 234
unmountList = [mountPoints]; // 235
} else if (mountPoints.length) { // 236
// Got an array // 237
unmountList = mountPoints; // 238
} // 239
// 240
// If we have a list to unmount // 241
if (unmountList) { // 242
// Iterate over each item // 243
FS.Utility.each(unmountList, function(mountPoint) { // 244
// Check _existingMountPoints to make sure the mount point exists in our // 245
// context / was created by the FS.HTTP.mount // 246
if (_existingMountPoints[mountPoint]) { // 247
// Mark as unmount // 248
unmountPoints[mountPoint] = false; // 249
// Release // 250
delete _existingMountPoints[mountPoint]; // 251
} // 252
}); // 253
FS.debug && console.log('FS.HTTP.unmount:'); // 254
FS.debug && console.log(unmountPoints); // 255
// Complete unmount // 256
HTTP.methods(unmountPoints); // 257
} // 258
}; // 259
// 260
// ### FS.Collection maps on HTTP pr. default on the following restpoints: // 261
// * // 262
// baseUrl + '/files/:collectionName/:id/:filename', // 263
// baseUrl + '/files/:collectionName/:id', // 264
// baseUrl + '/files/:collectionName' // 265
// // 266
// Change/ replace the existing mount point by: // 267
// ```js // 268
// // unmount all existing // 269
// FS.HTTP.unmount(); // 270
// // Create new mount point // 271
// FS.HTTP.mount([ // 272
// '/cfs/files/:collectionName/:id/:filename', // 273
// '/cfs/files/:collectionName/:id', // 274
// '/cfs/files/:collectionName' // 275
// ]); // 276
// ``` // 277
// // 278
mountUrls = function mountUrls() { // 279
// We unmount first in case we are calling this a second time // 280
FS.HTTP.unmount(); // 281
// 282
FS.HTTP.mount([ // 283
baseUrl + '/files/:collectionName/:id/:filename', // 284
baseUrl + '/files/:collectionName/:id', // 285
baseUrl + '/files/:collectionName' // 286
]); // 287
}; // 288
// 289
// Returns the userId from URL token // 290
var expirationAuth = function expirationAuth() { // 291
var self = this; // 292
// 293
// Read the token from '/hello?token=base64' // 294
var encodedToken = self.query.token; // 295
// 296
FS.debug && console.log("token: "+encodedToken); // 297
// 298
if (!encodedToken || !Meteor.users) return false; // 299
// 300
// Check the userToken before adding it to the db query // 301
// Set the this.userId // 302
var tokenString = FS.Utility.atob(encodedToken); // 303
// 304
var tokenObject; // 305
try { // 306
tokenObject = JSON.parse(tokenString); // 307
} catch(err) { // 308
throw new Meteor.Error(400, 'Bad Request'); // 309
} // 310
// 311
// XXX: Do some check here of the object // 312
var userToken = tokenObject.authToken; // 313
if (userToken !== ''+userToken) { // 314
throw new Meteor.Error(400, 'Bad Request'); // 315
} // 316
// 317
// If we have an expiration token we should check that it's still valid // 318
if (tokenObject.expiration != null) { // 319
// check if its too old // 320
var now = Date.now(); // 321
if (tokenObject.expiration < now) { // 322
FS.debug && console.log('Expired token: ' + tokenObject.expiration + ' is less than ' + now); // 323
throw new Meteor.Error(500, 'Expired token'); // 324
} // 325
} // 326
// 327
// We are not on a secure line - so we have to look up the user... // 328
var user = Meteor.users.findOne({ // 329
$or: [ // 330
{'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(userToken)}, // 331
{'services.resume.loginTokens.token': userToken} // 332
] // 333
}); // 334
// 335
// Set the userId in the scope // 336
return user && user._id; // 337
}; // 338
// 339
HTTP.methods( // 340
{'/cfs/servertime': { // 341
get: function(data) { // 342
return Date.now().toString(); // 343
} // 344
} // 345
}); // 346
// 347
// Unify client / server api // 348
FS.HTTP.now = function() { // 349
return Date.now(); // 350
}; // 351
// 352
// Start up the basic mount points // 353
Meteor.startup(function () { // 354
mountUrls(); // 355
}); // 356
// 357
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
///////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package['wekan-cfs-access-point'] = {};
})();
+1 -1
View File
@@ -1,5 +1,5 @@
apiVersion: v2
appVersion: "5.97"
appVersion: "6.10"
dependencies:
- condition: mongodb.enabled
name: mongodb
+1 -1
View File
@@ -14,7 +14,7 @@ serviceAccounts:
##
image:
repository: quay.io/wekan/wekan
tag: v5.97
tag: v6.10
pullPolicy: IfNotPresent
## Configuration for wekan component
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "الوقت",
"title": "عنوان",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "تتبع",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "النوع",
@@ -610,6 +612,7 @@
"people": "الناس",
"registration": "تسجيل",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "دعوة",
"invite-people": "الناس المدعوين",
"to-boards": "إلى اللوحات",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Има карти с изработено време",
"time": "Време",
"title": "Заглавие",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Следене",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Тип",
@@ -610,6 +612,7 @@
"people": "Хора",
"registration": "Регистрация",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Покани",
"invite-people": "Покани хора",
"to-boards": "в табло/а",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Té fitxes amb temps dedicat",
"time": "Hora",
"title": "Títol",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "En seguiment",
"tracking-info": "Seràs notificat per cada canvi a aquelles fitxes de les que n'eres creador o membre",
"type": "Tipus",
@@ -610,6 +612,7 @@
"people": "Persones",
"registration": "Registre",
"disable-self-registration": "Deshabilita Auto-Registre",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Convida",
"invite-people": "Convida a persones",
"to-boards": "Al tauler(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Obsahuje karty se stráveným časem",
"time": "Čas",
"title": "Název",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Pozorující",
"tracking-info": "Budete informováni o všech změnách v kartách, u kterých jste tvůrce nebo člen.",
"type": "Typ",
@@ -610,6 +612,7 @@
"people": "Lidé",
"registration": "Registrace",
"disable-self-registration": "Vypnout svévolnou registraci",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Pozvánka",
"invite-people": "Pozvat lidi",
"to-boards": "Do tabel",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Har kort med anvendt tid",
"time": "Tid",
"title": "Titel",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Sporing",
"tracking-info": "Du vil få notifikation om alle ændringer i kort som du har oprettet eller er medlem af.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Personer",
"registration": "Tilmelding",
"disable-self-registration": "Slå selv-tilmelding fra",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invitér",
"invite-people": "Invitér personer",
"to-boards": "Til tavle(r)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten",
"time": "Zeit",
"title": "Titel",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Folgen",
"tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.",
"type": "Typ",
@@ -610,6 +612,7 @@
"people": "Nutzer",
"registration": "Registrierung",
"disable-self-registration": "Selbstregistrierung deaktivieren",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Einladen",
"invite-people": "Nutzer einladen",
"to-boards": "In Board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklistenaktionen",
"moveChecklist": "Checkliste verschieben",
"moveChecklistPopup-title": "Checkliste verschieben",
"newlineBecomesNewChecklistItem": "Neue Zeile wird neuer Checklisteneintrag"
"newlineBecomesNewChecklistItem": "Neue Zeile wird neuer Checklisteneintrag",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten",
"time": "Zeit",
"title": "Titel",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Folgen",
"tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.",
"type": "Typ",
@@ -610,6 +612,7 @@
"people": "Nutzer",
"registration": "Registrierung",
"disable-self-registration": "Selbstregistrierung deaktivieren",
"disable-forgot-password": "\"Passwort vergessen\" deaktivieren",
"invite": "Einladen",
"invite-people": "Nutzer einladen",
"to-boards": "In Board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Listenaktionen",
"moveChecklist": "Checkliste bewegen",
"moveChecklistPopup-title": "Checkliste bewegen",
"newlineBecomesNewChecklistItem": "Neue Zeile wird neuer Checklisteneintrag"
"newlineBecomesNewChecklistItem": "Neue Zeile wird neuer Checklisteneintrag",
"copyChecklist": "Checkliste kopieren",
"copyChecklistPopup-title": "Checkliste kopieren",
"card-show-lists": "Listen anzeigen"
}
+10 -4
View File
@@ -435,7 +435,7 @@
"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-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.",
@@ -537,7 +537,7 @@
"save": "Speichern",
"search": "Suchen",
"rules": "Regeln",
"search-cards": "Suche nach Karten-/Listentiteln, Beschreibungen und personalisierten Feldern auf diesem Brett ",
"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",
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten",
"time": "Zeit",
"title": "Titel",
"toggle-labels": "Label 1-9 zur Karte hinzufügen. Bei Mehrfachauswahl Label 1-9 hinzufügen",
"remove-labels-multiselect": "Labels 1-9 bei Karten-Mehrfachauswahl entfernen",
"tracking": "Folgen",
"tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.",
"type": "Typ",
@@ -609,7 +611,8 @@
"settings": "Einstellungen",
"people": "Nutzer",
"registration": "Registrierung",
"disable-self-registration": "Selbstregistrierung deaktivieren",
"disable-self-registration": "Selbstregistrierung deaktivierenSelbstregistrierung deaktivieren",
"disable-forgot-password": "\"Passwort vergessen\" deaktivieren",
"invite": "Einladen",
"invite-people": "Nutzer einladen",
"to-boards": "In Board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklistenaktionen",
"moveChecklist": "Checkliste verschieben",
"moveChecklistPopup-title": "Checkliste verschieben",
"newlineBecomesNewChecklistItem": "Neue Zeile wird ein neues Checklistenelement"
"newlineBecomesNewChecklistItem": "Neue Zeile wird ein neues Checklistenelement",
"copyChecklist": "Checkliste kopieren",
"copyChecklistPopup-title": "Checkliste kopieren",
"card-show-lists": "Listen anzeigen"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Έχει κάρτες με δαπανηθέντα χρόνο",
"time": "Ώρα",
"title": "Τίτλος",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Καταγραφή",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Τύπος",
@@ -610,6 +612,7 @@
"people": "Άνθρωποι",
"registration": "Εγγραφή",
"disable-self-registration": "Απενεργοποίηση Αυτό-Εγγραφής",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Πρόσκληση",
"invite-people": "Πρόσκάλεσε Ανθρώπους",
"to-boards": "Στον πίνακα(ες)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1142,5 +1145,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Tempo",
"title": "Titolo",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Tipo",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+8 -2
View File
@@ -179,7 +179,7 @@
"cardCustomFieldsPopup-title": "Editar campos personalizados",
"cardStartVotingPopup-title": "Start a vote",
"positiveVoteMembersPopup-title": "Proponents",
"negativeVoteMembersPopup-title": "Opponents",
"negativeVoteMembersPopup-title": "Oponentes",
"card-edit-voting": "Edit voting",
"editVoteEndDatePopup-title": "Change vote end date",
"allowNonBoardMembers": "Allow all logged in users",
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Ha gastado tarjetas de tiempo",
"time": "Hora",
"title": "Título",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Seguimiento",
"tracking-info": "Serás notificado de cualquier cambio a aquellas tarjetas en las que seas creador o miembro.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Gente",
"registration": "Registro",
"disable-self-registration": "Desactivar auto-registro",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invitar",
"invite-people": "Invitar Gente",
"to-boards": "A tarjeta(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
"time": "Hora",
"title": "Título",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Siguiendo",
"tracking-info": "Serás notificado de cualquier cambio en las tarjetas en las que participas como creador o miembro.",
"type": "Tipo",
@@ -610,6 +612,7 @@
"people": "Personas",
"registration": "Registro",
"disable-self-registration": "Deshabilitar autoregistro",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invitar",
"invite-people": "Invitar a personas",
"to-boards": "A el(los) tablero(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
"time": "Hora",
"title": "Título",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Siguiendo",
"tracking-info": "Será notificado de cualquier cambio en las tarjetas en las que participa como creador o miembro.",
"type": "Tipo",
@@ -610,6 +612,7 @@
"people": "Personas",
"registration": "Registro",
"disable-self-registration": "Deshabilitar autoregistro",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invitar",
"invite-people": "Invitar a personas",
"to-boards": "A el(los) tablero(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Se ha excedido el tiempo de las tarjetas",
"time": "Hora",
"title": "Título",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Siguiendo",
"tracking-info": "Serás notificado de cualquier cambio en las tarjetas en las que participas como creador o miembro.",
"type": "Tipo",
@@ -610,6 +612,7 @@
"people": "Personas",
"registration": "Registro",
"disable-self-registration": "Deshabilitar autoregistro",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invitar",
"invite-people": "Invitar a personas",
"to-boards": "A el(los) tablero(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "On veetnud aega kaardid",
"time": "Aeg",
"title": "Pealkiri",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Jälgimine",
"tracking-info": "Teid teavitatakse kõigist muudatustest nende kaartide puhul, millega olete seotud loojana või liikmena.",
"type": "Tüüp",
@@ -610,6 +612,7 @@
"people": "Inimesed",
"registration": "Registreerimine",
"disable-self-registration": "Iseregistreerimise väljalülitamine",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Kutsu",
"invite-people": "Kutsuge inimesi",
"to-boards": "Tahvli(de)le",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Erabilitako denbora txartelak ditu",
"time": "Ordua",
"title": "Izenburua",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Jarraitzen",
"tracking-info": "Sortzaile edo kide gisa parte-hartzen duzun txartelei egindako aldaketak jakinaraziko zaizkizu.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Jendea",
"registration": "Izen-ematea",
"disable-self-registration": "Desgaitu nork bere burua erregistratzea",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Gonbidatu",
"invite-people": "Gonbidatu jendea",
"to-boards": "Arbele(ta)ra",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+12 -6
View File
@@ -107,7 +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.",
"app-try-reconnect": "تلاش برای ارتباط مجدد.",
"archive": "Move to Archive",
"archive-all": "Move All to Archive",
"archive-board": "Move Board to Archive",
@@ -211,7 +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?",
"cardArchivePopup-title": "کارت آرشیو شود؟",
"cardDetailsActionsPopup-title": "Card Actions",
"cardLabelsPopup-title": "Labels",
"cardMembersPopup-title": "Members",
@@ -242,7 +242,7 @@
"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",
"close-card": "بستن کارت",
"color-black": "black",
"color-blue": "blue",
"color-crimson": "crimson",
@@ -273,7 +273,7 @@
"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?",
"comment-delete": "مطمئن هستید که می‌خواهید این نظر را حذف کنید؟",
"deleteCommentPopup-title": "Delete comment?",
"no-comments": "No comments",
"no-comments-desc": "Can not see comments and activities.",
@@ -467,7 +467,7 @@
"set-color-list": "Set Color",
"listActionPopup-title": "List Actions",
"settingsUserPopup-title": "User Settings",
"settingsTeamPopup-title": "Team Settings",
"settingsTeamPopup-title": "تنظمیات تیم",
"settingsOrgPopup-title": "Organization Settings",
"swimlaneActionPopup-title": "Swimlane Actions",
"swimlaneAddPopup-title": "Add a Swimlane below",
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "زمان",
"title": "عنوان",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "پیگردی",
"tracking-info": "شما از هرگونه تغییر در کارتهایی که بعنوان ایجاد کننده ویا عضو آن هستید، آگاه خواهید شد",
"type": "نوع",
@@ -610,6 +612,7 @@
"people": "افراد",
"registration": "ثبت نام",
"disable-self-registration": "‌غیرفعال‌سازی خودثبت‌نامی",
"disable-forgot-password": "Disable Forgot Password",
"invite": "دعوت",
"invite-people": "دعوت از افراد",
"to-boards": "به برد(ها)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Sisältää käytetty aika -kortteja",
"time": "Aika",
"title": "Otsikko",
"toggle-labels": "Muokkaa nimilappujen 1-9 näkyvyyttä kortilla. Monivalinta lisää nimilaput 1-9",
"remove-labels-multiselect": "Monivalinta poistaa nimilaput 1-9",
"tracking": "Ilmoitukset",
"tracking-info": "Sinulle ilmoitetaan muutoksista korteissa joihin olet osallistunut luojana tai jäsenenä.",
"type": "Tyyppi",
@@ -610,6 +612,7 @@
"people": "Ihmiset",
"registration": "Rekisteröinti",
"disable-self-registration": "Poista käytöstä itserekisteröityminen",
"disable-forgot-password": "Poista käytöstä unohditko salasanasi",
"invite": "Kutsu",
"invite-people": "Kutsu ihmisiä",
"to-boards": "Taulu(i)lle",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Tarkistuslista toimet",
"moveChecklist": "Siirrä tarkistuslista",
"moveChecklistPopup-title": "Siirrä tarkistuslista",
"newlineBecomesNewChecklistItem": "Uusi rivi muuttuu uudeksi tarkistuslistakohdaksi"
"newlineBecomesNewChecklistItem": "Uusi rivi muuttuu uudeksi tarkistuslistakohdaksi",
"copyChecklist": "Kopioi tarkistuslista",
"copyChecklistPopup-title": "Kopioi tarkistuslista",
"card-show-lists": "Näytä listat kortilla"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "A des cartes avec du temps passé",
"time": "Temps",
"title": "Titre",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Suivi",
"tracking-info": "Vous serez notifié de toute modification concernant les cartes pour lesquelles vous êtes impliqué en tant que créateur ou participant.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Personne",
"registration": "Inscription",
"disable-self-registration": "Désactiver l'inscription",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Inviter",
"invite-people": "Inviter une personne",
"to-boards": "Au(x) tableau(x)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Actions sur la checklist",
"moveChecklist": "Déplacer la checklist",
"moveChecklistPopup-title": "Déplacer la checklist",
"newlineBecomesNewChecklistItem": "Chaque retour à la ligne produit un nouvel élément de checklist"
"newlineBecomesNewChecklistItem": "Chaque retour à la ligne produit un nouvel élément de checklist",
"copyChecklist": "Copier la checklist",
"copyChecklistPopup-title": "Copier la checklist",
"card-show-lists": "Afficher les listes sur la carte"
}
+1151
View File
File diff suppressed because it is too large. Load diff
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Hora",
"title": "Título",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Seguimento",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Persoas",
"registration": "Rexistro",
"disable-self-registration": "Desactivar o auto-rexistro",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Convidar",
"invite-people": "Convidar persoas",
"to-boards": "Ao(s) taboleiro(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "יש כרטיסי זמן שהושקע",
"time": "זמן",
"title": "כותרת",
"toggle-labels": "החלפת מצב תוויות 1-‎9 לכרטיס. בחירה מרוכזת מוסיפה תוויות 1‏-9",
"remove-labels-multiselect": "בחירה מרוכזת מסירה תוויות 1-‏9",
"tracking": "מעקב",
"tracking-info": "על כל שינוי בכרטיסים בהם הייתה לך מעורבות ברמת היצירה או כחברות תגיע אליך הודעה.",
"type": "סוג",
@@ -610,6 +612,7 @@
"people": "אנשים",
"registration": "הרשמה",
"disable-self-registration": "השבתת הרשמה עצמית",
"disable-forgot-password": "השבתת סיסמה שנשכחה",
"invite": "הזמנה",
"invite-people": "הזמנת אנשים",
"to-boards": "ללוח/ות",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "פעולות על רשימת מטלות",
"moveChecklist": "העברת רשימת מטלות",
"moveChecklistPopup-title": "העברת רשימת מטלות",
"newlineBecomesNewChecklistItem": "שורה חדשה הופכת לפריט חדש ברשימת המטלות"
"newlineBecomesNewChecklistItem": "שורה חדשה הופכת לפריט חדש ברשימת המטלות",
"copyChecklist": "העתקת רשימת מטלות",
"copyChecklistPopup-title": "העתקת רשימת סימון",
"card-show-lists": "הצגת רשימות על הכרטיס"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time कार्ड",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You हो जाएगा notified of any changes तक those कार्ड you are involved as creator or सदस्य.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To बोर्ड(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time कार्ड",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You हो जाएगा notified of any changes तक those कार्ड you are involved as creator or सदस्य.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To बोर्ड(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Vrijeme",
"title": "Naziv",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "Bit ćeš obaviješten o svim promjenama na onim karticama u koje si uključen kao autor ili član.",
"type": "Tip",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registracija",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Pozovi",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Van eltöltött-idő kártyája",
"time": "Idő",
"title": "Cím",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Követés",
"tracking-info": "Értesítve leszel az összes olyan kártya változásáról, amelyen létrehozóként vagy tagként veszel részt.",
"type": "Típus",
@@ -610,6 +612,7 @@
"people": "Emberek",
"registration": "Regisztráció",
"disable-self-registration": "Önregisztráció letiltása",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Meghívás",
"invite-people": "Emberek meghívása",
"to-boards": "Táblákhoz",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Waktu",
"title": "Judul",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Pelacakan",
"tracking-info": "Anda akan dinotifikasi semua perubahan di kartu tersebut diaman anda terlibat sebagai creator atau partisipan",
"type": "tipe",
@@ -610,6 +612,7 @@
"people": "Orang-orang",
"registration": "Registrasi",
"disable-self-registration": "Nonaktifkan Swa Registrasi",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Undang",
"invite-people": "Undang Orang-orang",
"to-boards": "ke panel",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Ndị mmadụ",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Ci sono schede con tempo impiegato",
"time": "Ora",
"title": "Titolo",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Monitoraggio",
"tracking-info": "Sarai notificato per tutte le modifiche alle schede delle quali sei creatore o membro.",
"type": "Tipo",
@@ -610,6 +612,7 @@
"people": "Persone",
"registration": "Registrazione",
"disable-self-registration": "Disabilita Auto-registrazione",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invita",
"invite-people": "Invita persone",
"to-boards": "Alla(e) bacheca",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Azioni Checklist",
"moveChecklist": "Sposta Checklist",
"moveChecklistPopup-title": "Sposta Checklist",
"newlineBecomesNewChecklistItem": "Nuove linee diventano elementi della checklist"
"newlineBecomesNewChecklistItem": "Nuove linee diventano elementi della checklist",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "作業時間ありのカード",
"time": "時間",
"title": "タイトル",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "トラッキング",
"tracking-info": "これらのカードへの変更が通知されるようになります。",
"type": "タイプ",
@@ -610,6 +612,7 @@
"people": "メンバー",
"registration": "登録",
"disable-self-registration": "自己登録を無効化",
"disable-forgot-password": "Disable Forgot Password",
"invite": "招待",
"invite-people": "メンバーを招待",
"to-boards": "ボードへ移動",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "აქვს გახარჯული დროის ბარათები",
"time": "დრო",
"title": "სათაური",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "მონიტორინგი",
"tracking-info": "თქვენ მოგივათ შეტყობინება ამ ბარათებში განხორციელებული ნებისმიერი ცვლილებების შესახებ, როგორც შემქმნელს ან წევრს. ",
"type": "ტიპი",
@@ -610,6 +612,7 @@
"people": "ხალხი",
"registration": "რეგისტრაცია",
"disable-self-registration": "თვით რეგისტრაციის გამორთვა",
"disable-forgot-password": "Disable Forgot Password",
"invite": "მოწვევა",
"invite-people": "ხალხის მოწვევა",
"to-boards": "დაფა(ებ)ზე",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "មានកាតដែលបានចំណាយពេល",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "시간",
"title": "제목",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "추적",
"tracking-info": "보드 생성자 또는 멤버로 참여하는 모든 카드에 대한 변경사항 알림 받음",
"type": "타입",
@@ -610,6 +612,7 @@
"people": "사람",
"registration": "회원가입",
"disable-self-registration": "일반 유저의 회원 가입 막기",
"disable-forgot-password": "Disable Forgot Password",
"invite": "초대",
"invite-people": "사람 초대",
"to-boards": "보드로 부터",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Kartiņas ar pavadīto laiku",
"time": "Laiks",
"title": "Nosaukums",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Sekošana",
"tracking-info": "Saņemsiet ziņojumu par jebkādām izmaiņām kartiņās, kurām esat vai nu veidotājs vai nu dalībnieks.",
"type": "Veids",
@@ -610,6 +612,7 @@
"people": "Dalībnieki",
"registration": "Reģistrācija",
"disable-self-registration": "Atspējot dalībnieku patstāvīgu reģistrāciju",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Ielūgt",
"invite-people": "Ielūgt dalībniekus",
"to-boards": "Uz dēli (dēļiem)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Има карти с изработено време",
"time": "Време",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Следене",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Хора",
"registration": "Регистрация",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Покани",
"invite-people": "Покани хора",
"to-boards": "в табло/а",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+7 -1
View File
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Has spent time cards",
"time": "Time",
"title": "Title",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Tracking",
"tracking-info": "You will be notified of any changes to those cards you are involved as creator or member.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "People",
"registration": "Registration",
"disable-self-registration": "Disable Self-Registration",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Invite",
"invite-people": "Invite People",
"to-boards": "To board(s)",
@@ -1141,5 +1144,8 @@
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item",
"copyChecklist": "Copy Checklist",
"copyChecklistPopup-title": "Copy Checklist",
"card-show-lists": "Card Show Lists"
}
+58 -52
View File
@@ -107,7 +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.",
"app-try-reconnect": "Prøv å koble til på nytt.",
"archive": "Flytt til Arkiv",
"archive-all": "Flytt alt til Arkiv",
"archive-board": "Flytt Tavle til Arkiv",
@@ -273,18 +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?",
"comment-delete": "Er du sikker på at du vil slette kommentaren?",
"deleteCommentPopup-title": "Slette kommentaren?",
"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-popup": "Are you sure you want to delete the checklist?",
"checklistDeletePopup-title": "Delete Checklist?",
"confirm-checklist-delete-popup": "Er du sikker på at du vil slette sjekklisten?",
"checklistDeletePopup-title": "Slette sjekklisten?",
"copy-card-link-to-clipboard": "Kopier lenke",
"copy-text-to-clipboard": "Copy text to clipboard",
"copy-text-to-clipboard": "Kopier tekst til utklippstavlen",
"linkCardPopup-title": "Link Kort",
"searchElementPopup-title": "Søk",
"copyCardPopup-title": "Kopier Kort",
@@ -571,6 +571,8 @@
"has-spenttime-cards": "Kort med forbrukt tid",
"time": "Tid",
"title": "Tittel",
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
"tracking": "Sporing",
"tracking-info": "Du vil bli varslet om alle endringer på kortene du er du er involvert i som Oppretter eller Medlem.",
"type": "Type",
@@ -610,6 +612,7 @@
"people": "Medlemmer",
"registration": "Registrering",
"disable-self-registration": "Deaktiver selvregistrering",
"disable-forgot-password": "Disable Forgot Password",
"invite": "Inviter",
"invite-people": "Invitere medlemmer",
"to-boards": "til Tavle(r)",
@@ -942,8 +945,8 @@
"label-color-not-found": "Farge på Merke %s ikke funnet.",
"user-username-not-found": "Brukernavn '%s' ikke funnet.",
"comment-not-found": "Kort med kommentar som inneholder teksten '%s' ikke funnet.",
"org-name-not-found": "Organization '%s' not found.",
"team-name-not-found": "Team '%s' not found.",
"org-name-not-found": "Organisasjonen '%s' ikke funnet.",
"team-name-not-found": "Teamet '%s' ikke funnet.",
"globalSearch-title": "Søk i alle Tavler.",
"no-cards-found": "Ingen Kort funnet.",
"one-card-found": "Ett Kort funnet.",
@@ -972,7 +975,7 @@
"operator-comment": "kommentar",
"operator-has": "har",
"operator-limit": "begens",
"operator-debug": "debug",
"operator-debug": "feilsøk",
"operator-org": "org",
"operator-team": "team",
"predicate-archived": "arkivert",
@@ -996,15 +999,15 @@
"predicate-member": "Medlem",
"predicate-public": "offentlig",
"predicate-private": "privat",
"predicate-selector": "selector",
"predicate-projection": "projection",
"predicate-selector": "utvelger",
"predicate-projection": "projeksjon",
"operator-unknown-error": "%s er ikke en operator",
"operator-number-expected": "operator __operator__ forventet et tall, mottok '__value__'",
"operator-sort-invalid": "sortering av '%s' er ugyldig",
"operator-status-invalid": "'%s' er ikke en gyldig status",
"operator-has-invalid": "%s er ikke en gyldig kontroll av eksistens",
"operator-limit-invalid": "%ser ikke en gyldig begrensning. Begrensning må være et positivt heltall.",
"operator-debug-invalid": "%s is not a valid debug predicate",
"operator-debug-invalid": "%s er ikke et tillat predikat for feilsøk",
"next-page": "Neste Side",
"previous-page": "Forrige Side",
"heading-notes": "Notater",
@@ -1022,8 +1025,8 @@
"globalSearch-instructions-operator-member": "`__operator_member__:<username>` - kort hvor *<username>* er et *medlem*",
"globalSearch-instructions-operator-assignee": "`__operator_assignee__:<username>` - kort hvor *<username>* er en *rettighetstaker*",
"globalSearch-instructions-operator-creator": "`__operator_creator__:<username>` - kort hvor *<username>* er kortenes oppretter",
"globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - cards belonging to a board assigned to organization *<name>*",
"globalSearch-instructions-operator-team": "`__operator_team__:<display name|short name>` - cards belonging to a board assigned to team *<name>*",
"globalSearch-instructions-operator-org": "`__operator_org__:<display name|short name>` - kort tilhørende en tavle tilknyttet organisasjonen *<name>*",
"globalSearch-instructions-operator-team": "`__operator_org__:<display name|short name>` - kort tilhørende en tavle tilknyttet teamet *<name>*",
"globalSearch-instructions-operator-due": "`__operator_due__:<n>` - kort som forfaller om *<n>* dager fra nå. `__operator_due__:__predicate_overdue__ lister alle kort med passert forfallsdato.",
"globalSearch-instructions-operator-created": "`__operator_created__:<n>` - kort som er opprettet *<n>* dager siden eller mindre",
"globalSearch-instructions-operator-modified": "`__operator_modified__:<n>` - kort som er modifisert *<n>* dager siden eller mindre",
@@ -1070,8 +1073,8 @@
"orphanedFilesReportTitle": "Rapportering Foreldreløse Filer",
"reports": "Rapportering",
"rulesReportTitle": "Rapportering Regler",
"boardsReportTitle": "Boards Report",
"cardsReportTitle": "Cards Report",
"boardsReportTitle": "Rapport tavler",
"cardsReportTitle": "Rapport kort",
"copy-swimlane": "Kopiér Svømmebane",
"copySwimlanePopup-title": "Kopiér Svømmebane",
"display-card-creator": "Vis etablerer av Kort",
@@ -1105,41 +1108,44 @@
"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",
"add-teams": "Opprett team",
"add-teams-label": "Opprettede team vist nedenfor:",
"remove-team-from-table": "Er du sikker på at du vil fjerne dette teamet fra tavlen?",
"confirm-btn": "Bekreft",
"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!",
"checklistActionsPopup-title": "Checklist Actions",
"moveChecklist": "Move Checklist",
"moveChecklistPopup-title": "Move Checklist",
"newlineBecomesNewChecklistItem": "Newline becomes new checklist item"
"filter-card-title-label": "Filtrer etter tittel på kort",
"invite-people-success": "Vellykket utsendelse av invitasjon til registrering ",
"invite-people-error": "Feil ved utsendelse av invitasjon til registrering ",
"can-invite-if-same-mailDomainName": "Navn på epostdomene",
"to-create-teams-contact-admin": "For opprettelse av team, vennligst kontakt administrator.",
"Node_heap_total_heap_size": "Node heap: samlet heap størrelse",
"Node_heap_total_heap_size_executable": "Node heap: samlet heapstørrelse for eksekverbare",
"Node_heap_total_physical_size": "Node heap: samlet fysisk størrelse",
"Node_heap_total_available_size": "Node heap: samlet tilgjengelig størrelse",
"Node_heap_used_heap_size": "Node heap: brukt heapstørrelse",
"Node_heap_heap_size_limit": "Node heap: begrensning heapstørrelse",
"Node_heap_malloced_memory": "Node heap: malloced minne",
"Node_heap_peak_malloced_memory": "Node heap: topp malloced minne",
"Node_heap_does_zap_garbage": "Node heap: utfører tømming av søppel",
"Node_heap_number_of_native_contexts": "Node heap: antall opprinnelige kontekster",
"Node_heap_number_of_detached_contexts": "Node heap: antall frakoblede kontekster",
"Node_memory_usage_rss": "Node minnebruk: størrelse innebygget datasett",
"Node_memory_usage_heap_total": "Node minnebruk: samlet størrelse på allokert heap",
"Node_memory_usage_heap_used": "Node minnebruk: faktisk minnebruk",
"Node_memory_usage_external": "Node minnebruk: eksternt",
"add-organizations": "Legg til organisasjoner",
"add-organizations-label": "Opprettede organisasjoner vist nedenfor:",
"remove-organization-from-board": "Er du sikker på at du vil fjerne organisasjonen fra denne tavlen?",
"to-create-organizations-contact-admin": "For opprettelse av organisasjoner, vennligst kontakt administrator.",
"custom-legal-notice-link-url": "Nettadresse for egendefinert juridisk merknadsside",
"acceptance_of_our_legalNotice": "Ved å fortsette, aksepterer du vår",
"legalNotice": "juridiske merknader",
"copied": "Kopiert!",
"checklistActionsPopup-title": "Sjekkliste aksjoner",
"moveChecklist": "Flytt sjekkliste",
"moveChecklistPopup-title": "Flytt sjekkliste",
"newlineBecomesNewChecklistItem": "Ny linje gir nytt sjekklisteobjekt",
"copyChecklist": "Kopier sjekkliste",
"copyChecklistPopup-title": "Kopier sjekkliste",
"card-show-lists": "Vis liste over kort"
}
Loaded 100 of 370 files, more files were not shown because too many files have changed in this diff. Show more