Compare commits

...
513 Commits
Author SHA1 Message Date
Lauri Ojansivu 343dcb4995 v5.73 2021-11-11 20:09:52 +02:00
Lauri Ojansivu 546134f6cd Updated ChangeLog. 2021-11-11 20:06:28 +02:00
Lauri Ojansivu ac7ef4d4cd Updated dependencies.
Thanks to developers of dependencies!
2021-11-11 20:05:13 +02:00
Lauri Ojansivu eb1d3b6101 Updated ChangeLog. 2021-11-11 19:38:07 +02:00
Lauri Ojansivu 6151382c07 Fix typos. 2021-11-11 19:36:49 +02:00
Lauri Ojansivu 1516be030e Merge pull request #4135 from Ben0it-T/master
Fix: Impossible to export board to excel where title exceeding 31 chars
2021-11-11 19:34:32 +02:00
Lauri Ojansivu 5eb7ce09b2 Updated translations. 2021-11-11 19:32:31 +02:00
Lauri Ojansivu d791914ddd Updated ChangeLog. 2021-11-11 19:32:18 +02:00
Lauri Ojansivu fb09efd1a4 Merge branch 'Emile840-master' 2021-11-11 19:25:42 +02:00
Lauri Ojansivu 2d749e13e0 Fixed typos. 2021-11-11 19:25:19 +02:00
Lauri Ojansivu 712ae37400 Merge branch 'master' of https://github.com/Emile840/wekan into Emile840-master 2021-11-11 19:19:12 +02:00
Lauri Ojansivu 92ba5f8874 Updated ChangeLog. 2021-11-11 19:17:43 +02:00
Lauri Ojansivu 8cf392e1ea Merge branch 'mfilser-card_detail_popup_load_comments_from_board_search' 2021-11-11 19:15:35 +02:00
Lauri Ojansivu ea01c5c1b9 Disable console.log 2021-11-11 19:12:25 +02:00
Lauri Ojansivu 0991e54c22 Fixed typo. 2021-11-11 19:04:17 +02:00
Ben0it-T 08a01c6d2c Fix: Impossible to export board to excel where title exceeding 31 chars 2021-11-11 13:16:17 +01:00
Emile840 95cf54836f Merge branch 'master' into master 2021-11-10 16:56:42 +01:00
Emile NDAGIJIMANA 81f5b6a428 Fix this bug, if OIDC button text was customized, the default text will be added if a user click on 'Forgot your password' and valid or ckick on 'Register' 2021-11-10 16:48:47 +01:00
Martin Filser f1b49e05eb Card detail popup loads now comments if opened from board search 2021-11-09 12:55:10 +01:00
Lauri Ojansivu fdd23e2f54 Merge branch 'master' of github.com:wekan/wekan 2021-11-09 13:53:33 +02:00
Lauri Ojansivu f906153b47 Updated ChangeLog. 2021-11-09 13:53:24 +02:00
Lauri Ojansivu 34fa83a461 Merge pull request #4122 from mfilser/sidebar_search_card_popup_only_mobile_view
Sidebar search only opens the card as popup on mobile view
2021-11-09 13:52:39 +02:00
Martin Filser ddc229dabe Sidebar search only opens the card as popup on mobile view 2021-11-08 15:06:29 +01:00
Lauri Ojansivu c4d42d86a2 Updated translations. 2021-11-08 13:14:20 +02:00
Lauri Ojansivu c2bd4d1cee Updated translations. 2021-11-07 15:12:20 +02:00
Lauri Ojansivu 4fb4deacf9 Updated ChangeLog. 2021-11-07 02:04:14 +02:00
Lauri Ojansivu ce5f2a19a5 Updated translations. 2021-11-07 01:29:46 +02:00
Lauri Ojansivu 05a1588bac Updated translations. 2021-11-07 01:14:34 +02:00
Lauri Ojansivu e21363d37e Merge branch 'Ben0it-T-master' 2021-11-07 00:48:43 +02:00
Lauri Ojansivu d8dad479fd Fixes typos. 2021-11-07 00:47:53 +02:00
Ben0it-T d04e9bbabd Add NodeJS statistics - part 2 - memory usage 2021-11-06 22:49:41 +01:00
Ben0it-T 790a82c4b1 Add NodeJS statistics - part 1 - heap statistics 2021-11-06 21:37:18 +01:00
Lauri Ojansivu 26826b6120 Updated translations. 2021-11-06 01:42:23 +02:00
Lauri Ojansivu f48f67340e Updated ChangeLog. 2021-11-06 01:39:42 +02:00
Lauri Ojansivu cf6713a31c Updated dependencies.
Thanks to developers of dependencies !
2021-11-06 01:38:15 +02:00
Lauri Ojansivu 30ef5c1bf6 Updated ChangeLog. 2021-11-06 01:37:48 +02:00
Lauri Ojansivu 1859f58ad9 Merge pull request #4117 from Ben0it-T/master
Card Details, add missing hr line (before Activity title)
2021-11-06 01:35:32 +02:00
Ben0it-T 3bc2862ae2 Card Details, add missing hr line (before Activity title) 2021-11-04 23:05:56 +01:00
Lauri Ojansivu 3ce1e8220b v5.72 2021-10-31 22:46:17 +02:00
Lauri Ojansivu 2d9c8740b4 Updated translations. 2021-10-31 21:12:38 +02:00
Lauri Ojansivu 502bfcb97d Added missing translation.
Thansk to Ben0it-T !

Related https://github.com/wekan/wekan/commit/b51152fca4bf6c7d2bc6b30204899b5d5fe361fd#commitcomment-59009965
2021-10-31 21:07:48 +02:00
Lauri Ojansivu 2bd23d9525 Updated translations. 2021-10-31 19:32:40 +02:00
Lauri Ojansivu a59a242c1e Fix typo. 2021-10-31 19:26:57 +02:00
Lauri Ojansivu 9530f38791 Updated ChangeLog. 2021-10-31 19:25:27 +02:00
Lauri Ojansivu c136033c1f Rename "Domaine" to "Domain" that is more like English.
Thanks to xet7 !
2021-10-31 19:23:51 +02:00
Lauri Ojansivu 17a5505eda Updated translations. 2021-10-31 19:19:44 +02:00
Lauri Ojansivu 8abea470fb Merge pull request #4109 from mfilser/minicard_no_text_one_line
Card labels on minicard withouth text are now at the same line again
2021-10-31 19:11:10 +02:00
Lauri Ojansivu 1d8ff8398c Updated ChangeLog. 2021-10-31 19:10:54 +02:00
Lauri Ojansivu 0af41dc19c Updated ChangeLog. 2021-10-31 19:09:24 +02:00
Lauri Ojansivu 21de4a2ca0 Merge pull request #4108 from Ben0it-T/master
Try to fix : Filter List by Title - Hide empty lists in Swimlane view
2021-10-31 19:08:02 +02:00
Lauri Ojansivu ed289451f6 Updated ChangeLog. 2021-10-31 19:07:12 +02:00
Lauri Ojansivu 045502c9e9 Restore original version number. 2021-10-31 19:01:53 +02:00
Lauri Ojansivu 405411f97f Merge branch 'Emile840-master' 2021-10-31 19:00:47 +02:00
Lauri Ojansivu 00c3092f44 Fix typos.
Thanks to xet7 !
2021-10-31 18:59:40 +02:00
Martin Filser e3d52169d7 Card labels on minicard withouth text are now at the same line again
Fixes: https://github.com/wekan/wekan/pull/4073#pullrequestreview-793677680
2021-10-31 14:59:28 +01:00
Ben0it-T be5b6245e3 Try to fix : Showing archived lists in Swimlane view 2021-10-30 16:33:18 +02:00
Ben0it-T 705e6d7e3a Add icon to Filter List by Title 2021-10-30 09:25:39 +02:00
Ben0it-T 6c83cb5b44 Try to fix : Filter List by Title - prevent showing only the list title - Hiding empty lists in Swimlane view 2021-10-30 00:58:57 +02:00
Emile NDAGIJIMANA b51152fca4 Add a possibility for non admin users who have email on a given domain name (in Admin panel settings) to send an invitation for inscription 2021-10-29 18:43:44 +02:00
Emile NDAGIJIMANA 344094ec18 conflit resolution 2021-10-29 18:41:28 +02:00
Lauri Ojansivu 89a7bb8bc8 v5.71 2021-10-29 11:02:41 +03:00
Lauri Ojansivu e762465e09 Updated translations. 2021-10-29 10:50:34 +03:00
Lauri Ojansivu 7d42b7eaf0 Updated translations. 2021-10-29 03:45:21 +03:00
Lauri Ojansivu 4106aab659 Updated ChangeLog. 2021-10-29 03:34:15 +03:00
Lauri Ojansivu df2a2aae1d Updated dependencies.
Thanks to developers of dependencies !
2021-10-29 03:32:36 +03:00
Lauri Ojansivu fbcafdbd02 Updated ChangeLog. 2021-10-29 03:28:18 +03:00
Lauri Ojansivu 7cc35970a8 Update GitHub issue template. Part 2. 2021-10-29 03:27:15 +03:00
Lauri Ojansivu 123654008f Updated translations. 2021-10-29 03:18:10 +03:00
Lauri Ojansivu 711182ef8a Updated ChangeLog. 2021-10-29 03:17:52 +03:00
Lauri Ojansivu 46a5eec7d2 Add info about upgrades to GitHub issue template.
Thanks to xet7 !
2021-10-29 03:16:26 +03:00
Lauri Ojansivu a42c132306 Update translations. 2021-10-29 02:55:19 +03:00
Lauri Ojansivu be8a3191d1 Updated translations. 2021-10-29 02:51:14 +03:00
Lauri Ojansivu 157f16a1d4 Updated ChangeLog. 2021-10-29 02:47:25 +03:00
Lauri Ojansivu 803c949c8d Merge pull request #4105 from Ben0it-T/master
Fix : Filter List by Card Title (#4066)
2021-10-29 02:44:33 +03:00
Ben0it-T e64bc38932 Fix : Filter List by Card Title 2021-10-28 22:45:44 +02:00
Lauri Ojansivu f1d96fcef8 v5.70 2021-10-28 16:20:36 +03:00
Lauri Ojansivu 5934b7a4a2 Updated translations. 2021-10-28 16:08:10 +03:00
Lauri Ojansivu 245d6dc96d Fix typo. 2021-10-28 16:05:04 +03:00
Lauri Ojansivu 1941ee6af5 Updated ChangeLog. 2021-10-28 16:04:30 +03:00
Lauri Ojansivu e3292dd562 Part 2: Docker: Try to fix "Failed export and unexpected container restart". Added timezone and localtime.
Thanks to akitzing, mfilser and xet7 !

Fixes #4089
2021-10-28 16:01:45 +03:00
Lauri Ojansivu ec33d0b34f Docker: Try to fix "Failed export and unexpected container restart". Added timezone and localtime.
Thanks to akitzing, mfilser and xet7 !

Fixes #4089
2021-10-28 15:48:48 +03:00
Lauri Ojansivu 5add2aaea6 Delete not needed files. 2021-10-28 15:48:25 +03:00
Lauri Ojansivu 50a849fccd Merge pull request #4103 from Emile840/master
fix bug regarding #4083 (last version add default display:none to checkbox)
2021-10-28 15:07:14 +03:00
Emile NDAGIJIMANA ef53ade32e fix bug regarding #4083 (last version add defaut display:none checkbox) 2021-10-28 13:56:54 +02:00
Lauri Ojansivu 3ee2156399 v5.69 2021-10-28 14:08:32 +03:00
Lauri Ojansivu 90cd26e78e Updated ChangeLog. 2021-10-28 14:00:35 +03:00
Lauri Ojansivu 4c9d10f7a7 Merge pull request #4101 from mfilser/popup_fixes_archive_cards_attachement_etc
Popup fixes: Archive cards, upload attachements etc
2021-10-28 13:54:44 +03:00
Martin Filser a686a18809 Fix: Card color setting reloaded the board (hotfix)
- There is another issue why the board get's reloaded again. If i comment
  out the whole events() block so the card color is not saved, the boards
  get reloaded too ...
2021-10-28 12:41:12 +02:00
Martin Filser c7ab0403a6 Card watching closes now the popup after confirmation 2021-10-28 12:40:18 +02:00
Martin Filser f90fb28483 Card archive closes now the popup after confirmation 2021-10-28 12:40:18 +02:00
Martin Filser fecb9cdb66 Popup#afterConfirm popup broke features like "Archiv Cards", "Upload Attachements" and so on -> fixed 2021-10-28 12:40:18 +02:00
Lauri Ojansivu 66df3cc2ee Updated ChangeLog. 2021-10-28 13:09:09 +03:00
Lauri Ojansivu d9adce7b67 Fix Docs: Only MAIL_URL and MAIL_FROM for email settings. Not Admin Panel anymore.
Thanks to niklasdahlheimer !

Fixes #4090
2021-10-28 13:06:43 +03:00
Emile NDAGIJIMANA 6f39a3cf1c transactions not commited 2021-10-28 11:28:33 +02:00
Emile NDAGIJIMANA f840d26faf [Adding team to the board] some meaningfuly texts on buttons 2021-10-28 11:27:22 +02:00
Lauri Ojansivu dfd5acea97 Updated ChangeLog. 2021-10-27 23:40:21 +03:00
Lauri Ojansivu 5411113544 Updated Docker base image to Ubuntu 21.10 Impish.
Thanks to Ubuntu developers!
2021-10-27 23:37:30 +03:00
Lauri Ojansivu d1eb6f2355 v5.68 2021-10-27 22:43:36 +03:00
Lauri Ojansivu aed1e71094 Updated ChangeLog. 2021-10-27 22:20:04 +03:00
Lauri Ojansivu 46f6d1e989 Merge pull request #4087 from mfilser/fix_labels_desktop_view_add_and_delete
Fix labels desktop view add and delete
2021-10-27 22:19:01 +03:00
Martin Filser e9c1b2b2c4 Fix: Labels on desktop view can be added/deleted again 2021-10-27 17:29:11 +02:00
Martin Filser 94f8fb2393 Fix: Labels at desktop view with enabled drag handles were sortable 2021-10-27 17:29:11 +02:00
Martin Filser 2055d916e9 Labels/Drag handles on desktop view with drag handles were too long 2021-10-27 17:29:11 +02:00
Lauri Ojansivu 70dbd1518d Updated ChangeLog. 2021-10-27 16:44:47 +03:00
Lauri Ojansivu 3db3a5bad9 Merge pull request #4084 from mfilser/labels_drag_drop
Adding drag/drop to labels
2021-10-27 16:21:43 +03:00
Lauri Ojansivu b8a41406f5 v5.67 2021-10-27 09:42:11 +03:00
Martin Filser c8b8fb83dc Labels drag/drop 2021-10-27 08:02:46 +02:00
Lauri Ojansivu cb9b8d4f2b Fix typo.
Thanks to xet7 !
2021-10-27 08:57:08 +03:00
Lauri Ojansivu 69ce16192d v5.66 2021-10-27 08:52:32 +03:00
Lauri Ojansivu 46efd27079 Updated translations. 2021-10-27 08:44:06 +03:00
Lauri Ojansivu 141e866719 Updated ChangeLog. 2021-10-27 08:41:04 +03:00
Lauri Ojansivu 4e7f1a9937 Merge pull request #4083 from Emile840/master
Add a possibility of selecting displayed users in admin panel
2021-10-27 08:39:54 +03:00
Lauri Ojansivu 3e7fee8fae Updated ChangeLog. 2021-10-27 08:39:28 +03:00
Lauri Ojansivu b09e5b2680 Merge pull request #4082 from mfilser/board_search_remove_limit
Board search remove limit
2021-10-27 08:37:31 +03:00
Emile NDAGIJIMANA fb00869e49 Add a possibility of selecting displayed users in admin panel 2021-10-26 17:31:23 +02:00
Martin Filser 4521d5c10d Search cards, dont't search on empty search term
- otherwise all cards / lists are returned, and at big boards it will
  take a long time to load all cards / lists
2021-10-26 12:48:47 +02:00
Martin Filser 5eb4cff991 Board search, remove limit of 10 lists 2021-10-26 12:48:47 +02:00
Martin Filser 20415b881c Board search, removed limit of 10 cards 2021-10-26 12:48:47 +02:00
Lauri Ojansivu 90b0a93547 Updated ChangeLog. 2021-10-26 01:53:09 +03:00
Lauri Ojansivu f67a174c4a Re-enables custom schemes auto linking.
Thanks to chrisi51 !

Related https://github.com/wekan/wekan/pull/4059
2021-10-26 01:50:28 +03:00
Lauri Ojansivu 8224410e0c Updated ChangeLog. 2021-10-25 23:56:33 +03:00
Lauri Ojansivu 7f78106211 Merge pull request #4079 from mfilser/minicard_label_popup
Minicard label popup
2021-10-25 23:54:46 +03:00
Martin Filser 0025212b3e Minicard, label popup only opened if a label is clicked 2021-10-25 22:39:23 +02:00
Martin Filser d79a35ea82 Minicard, label popup added 2021-10-25 22:39:23 +02:00
Lauri Ojansivu ce829f586b Updated translations. 2021-10-25 23:30:19 +03:00
Lauri Ojansivu a3d41c560b Revert "Re-enables custom schemes auto linking" https://github.com/wekan/wekan/pull/4059 because Markdown links did not work, commented out some code.
Thanks to mfilser and xet7 !

Related https://github.com/wekan/wekan/pull/4059
2021-10-25 23:06:13 +03:00
Lauri Ojansivu 5af4386a0f Updated translations. 2021-10-25 21:31:28 +03:00
Lauri Ojansivu c08c9543af Updated ChangeLog. 2021-10-25 21:21:17 +03:00
Lauri Ojansivu b25eeb334c Merge pull request #4078 from Ben0it-T/master
Fix : Filter List by Card Title - see #4066 comments
2021-10-25 21:20:02 +03:00
Lauri Ojansivu 5c2a44e6fe Updated ChangeLog. 2021-10-25 21:18:50 +03:00
Lauri Ojansivu 4c0d382fd8 Merge pull request #4077 from mfilser/comment_delete_confirmation_popup
Comment, added confirm delete popup
2021-10-25 21:17:51 +03:00
Ben0it-T 8550213146 Fix : Filter List by Card Title - see #4066 comments 2021-10-25 20:05:07 +02:00
Martin Filser 1a09b75974 Comment, added confirm delete popup 2021-10-25 20:00:17 +02:00
Lauri Ojansivu ea73e4ec7d Updated ChangeLog. 2021-10-25 20:44:20 +03:00
Lauri Ojansivu 7e45e0676a Merge pull request #4076 from mfilser/board_view_sort_cards_mobile_view
Board View, sort cards button also in mobile view
2021-10-25 20:43:27 +03:00
Martin Filser 6f09987b07 Board View, sort cards also in mobile view 2021-10-25 18:40:19 +02:00
Lauri Ojansivu a09b7a4002 Updated ChangeLog. 2021-10-25 18:53:24 +03:00
Lauri Ojansivu 8a51e271a2 Merge pull request #4075 from mfilser/card_dates_remove
Card dates, if deleted rules didn't apply on "unset date fields"
2021-10-25 18:50:27 +03:00
Martin Filser 53c827e134 Card dates, if deleted rules didn't apply on "unset date fields" 2021-10-25 17:37:19 +02:00
Lauri Ojansivu bcc17127a9 Updated ChangeLog. 2021-10-25 18:04:06 +03:00
Lauri Ojansivu 18ff4bee2d Merge pull request #4074 from mfilser/global_search_checklistitems_and_customFields_boolean
Global search checklistitems and custom fields boolean
2021-10-25 18:01:10 +03:00
Lauri Ojansivu 71068cf13e Updated ChangeLog. 2021-10-25 17:56:54 +03:00
Lauri Ojansivu 2666b30ba9 Added npm publish script for releases.
Thanks to xet7 !
2021-10-25 17:55:41 +03:00
Lauri Ojansivu 7a9ed24127 Updated ChangeLog. 2021-10-25 17:52:55 +03:00
Lauri Ojansivu 156c0b5d4d Updated dependencies.
Thanks to developers of dependencies!
2021-10-25 17:50:57 +03:00
Martin Filser e5a31e7f99 Global search, boolean custom fields are searched too
Fixes: #4035
2021-10-25 14:45:01 +02:00
Martin Filser ccc0b3bcf9 Global Search, Checklist-Items are searched now too 2021-10-25 14:45:01 +02:00
Lauri Ojansivu 44f6cc978d Updated ChangeLog. 2021-10-25 15:43:48 +03:00
Lauri Ojansivu c07646d13d Updated ChangeLog. 2021-10-25 15:40:36 +03:00
Lauri Ojansivu e20ca04fab Fix typos. 2021-10-25 15:39:26 +03:00
Lauri Ojansivu f14e710ac0 Updated dependencies.
Thanks to developers of dependencies!
2021-10-25 15:39:00 +03:00
Lauri Ojansivu 5546f6aa17 Merge branch 'chrisi51-master' 2021-10-25 15:26:48 +03:00
Lauri Ojansivu 9cfbd7b37d Merge branch 'master' of https://github.com/chrisi51/wekan into chrisi51-master 2021-10-25 15:26:12 +03:00
Lauri Ojansivu 62bfa75cf7 Updated ChangeLog. 2021-10-25 15:25:10 +03:00
Lauri Ojansivu fe2a7e207c Merge pull request #4073 from mfilser/labels_wrapped_if_too_long
Labels wrapped if too long
2021-10-25 15:24:13 +03:00
Lauri Ojansivu 1c2d4e5b4c Updated ChangeLog. 2021-10-25 14:47:40 +03:00
Martin Filser 2b33d7890c Labels in Minicard are now centered if the label is wrapped 2021-10-25 13:46:55 +02:00
Martin Filser e8c9222283 Labels in Card Details are now centered if the label is wrapped 2021-10-25 13:46:51 +02:00
Lauri Ojansivu a62a177fb1 Comment out slowing Search All Boards logs in console.
Thanks to mfilser and xet7 !

Fixes #4072
2021-10-25 14:43:56 +03:00
Martin Filser e954df4d8e Labels, wrap long text
CSS initial:
https://stackoverflow.com/questions/15901030/reset-remove-css-styles-for-element-only/15903168#15903168
2021-10-25 13:43:24 +02:00
Lauri Ojansivu d0a0c74fd9 Updated ChangeLog. 2021-10-25 14:40:34 +03:00
Lauri Ojansivu 552e99d460 Merge pull request #4071 from mfilser/card_popup_search_and_global_search
Card popup search and global search
2021-10-25 14:39:06 +03:00
Martin Filser ce30c7e1b7 Card Details, show card link in mobile view 2021-10-25 12:53:04 +02:00
Martin Filser 876d78eec4 Card Details Popup, Checklist-Items are now displayed if opened from Global Search 2021-10-25 12:53:04 +02:00
Martin Filser 0313e21ca1 Fix, move to top now works after moving the card (card details action popup) 2021-10-25 12:53:04 +02:00
Martin Filser e6f94c9d16 Move card to top - close Popup / back to previous popup 2021-10-25 12:53:04 +02:00
Martin Filser cdc4be3a13 Card Details Popup in Desktop View has (for now) no maximize button 2021-10-25 12:53:04 +02:00
Martin Filser 4131dd89d4 Global search open the minicard as Popup 2021-10-25 12:53:04 +02:00
Martin Filser 4936e580fd Board search open the minicard as Popup 2021-10-25 12:53:04 +02:00
Martin Filser b9250e4be4 Use Popup.back() instead of Popup.close() to get no conflicts if a Popup is opened as "Sub Popup"
- .back() is also .close() if there is no "popup layer" left
2021-10-25 12:53:04 +02:00
Martin Filser a59dfa8fc0 Card Details Popup, every "Sub-Popup" must use .back() instead of .close()
- .close() closes the popup. Until now it was ok, but as the Card
  Details are opened in a popup too, .back() must be used to get the
  same behaviour back
- .back() is also .close() if there is no "popup layer" left
2021-10-25 12:53:04 +02:00
Lauri Ojansivu 2fd2ea72fe Updated ChangeLog. 2021-10-25 13:52:42 +03:00
Lauri Ojansivu a6d3810e19 Merge pull request #4070 from mfilser/card_details_custom_fields_popup
Card details custom fields popup
2021-10-25 13:50:31 +03:00
Martin Filser 5e29c68154 Card Details, add plus button in custom fields section 2021-10-25 12:44:03 +02:00
Martin Filser 6b26b5d62b Card Details, moving the custom field sort switch after the last custom field 2021-10-25 12:44:03 +02:00
Martin Filser 81e617a149 Card Details, hr line occured twice if any date or any user isn't displayed 2021-10-25 12:44:03 +02:00
Lauri Ojansivu 013620c862 Updated ChangeLog. 2021-10-25 13:42:46 +03:00
Lauri Ojansivu 086aa51c2e Merge pull request #4069 from mfilser/fix_boards_not_loading_missing_filter
Boards weren't loaded because of missing filter
2021-10-25 13:41:33 +03:00
Martin Filser 95719cbd24 Boards weren't loaded because of missing filter 2021-10-25 12:32:48 +02:00
Lauri Ojansivu a23c8c263c Updated ChangeLog. 2021-10-25 13:29:33 +03:00
Lauri Ojansivu dfd1155790 Merge pull request #4068 from mfilser/fix_long_textarea_editing
Fix long textarea editing
2021-10-25 13:28:09 +03:00
Martin Filser 3a92cabc3f updated meteor-autosize to version 5.0.1
updated this "git" version:
https://raw.githubusercontent.com/jackmoore/autosize/8fc6a6d6f934bdfa621eb3bac341d34ad9337882/dist/autosize.js
2021-10-25 09:00:36 +02:00
Martin Filser 47446315ad Adding verron:autosize (meteor-autoresize) 2021-10-25 09:00:36 +02:00
Lauri Ojansivu c586a9bb39 Updated translations. 2021-10-25 02:38:52 +03:00
Lauri Ojansivu 4df3416b46 Updated ChangeLog. 2021-10-25 01:39:06 +03:00
Lauri Ojansivu a42a3436cd Merge pull request #4067 from mfilser/add_card_cancel_button
Add card button has now a cancel button
2021-10-25 01:35:16 +03:00
Martin Filser 367823ea5e Add card button has now a cancel button 2021-10-24 15:42:51 +02:00
Lauri Ojansivu ccb5acbe70 Updated ChangeLog. 2021-10-24 14:40:58 +03:00
Lauri Ojansivu b8e0dfa07d Merge pull request #4066 from Ben0it-T/master
Fix : Filter List by Card Title #3594
2021-10-24 14:39:12 +03:00
Lauri Ojansivu a167a1b4f4 Updated ChangeLog. 2021-10-24 14:38:15 +03:00
Lauri Ojansivu c95ccaa5c9 Merge pull request #4065 from mfilser/fix_markdown_header_quick_access
Fix markdown header quick access
2021-10-24 14:37:09 +03:00
Ben0it-T 5b5b8fe427 Fix : Filter List by Card Title #3594 2021-10-23 13:16:33 +02:00
Lauri Ojansivu 31af30175b Updated translations. 2021-10-22 18:10:46 +03:00
Lauri Ojansivu a22aacf29b Updated ChangeLog. 2021-10-21 19:40:48 +03:00
Lauri Ojansivu 6a06522777 Try to fix orphanedAttachments.
Thanks to Madko and xet7 !

Related #2776
2021-10-21 19:39:11 +03:00
Lauri Ojansivu c47b04493a Updated translations. 2021-10-21 19:27:17 +03:00
Martin Filser 6d701cda2e Mobile View quick list access show markdown 2021-10-21 18:24:49 +02:00
Martin Filser 8bb27e2762 Starred boards show markdown at the top starred line (Mobile View)
- Fixes: #4058
2021-10-21 18:24:49 +02:00
Martin Filser 437b62eb97 Starred boards show markdown at the top starred line
- Fixes: #4058
2021-10-21 18:24:49 +02:00
Lauri Ojansivu 88fbdfbb6b Updated ChangeLog. 2021-10-21 19:22:53 +03:00
Lauri Ojansivu 92eb3afa6c Merge pull request #4063 from mfilser/fix_main_scrollbar
Fix main scrollbar
2021-10-21 19:21:37 +03:00
Martin Filser ababeebbf0 Fixed scrollbar, occured twice at home screen (mobile view) 2021-10-21 11:28:32 +02:00
Martin Filser fdb3f83d1f Fixed scrollbar, occured twice at admin panel 2021-10-21 11:28:32 +02:00
Martin Filser a0e6fc4611 Fixed scrollbar, occured twice when opening a card 2021-10-21 11:28:32 +02:00
Lauri Ojansivu 2b62b3aa90 Updated translations. 2021-10-21 12:11:31 +03:00
Lauri Ojansivu 910c0705f7 Updated ChangeLog. 2021-10-21 12:08:42 +03:00
Lauri Ojansivu 35469364b4 Merge pull request #4062 from mfilser/popup_card_details
Popup card details
2021-10-21 12:04:31 +03:00
Martin Filser 2af5e9c209 Card Details Popup, Checklist Drag/Drop works in mobile view again 2021-10-21 09:46:05 +02:00
Martin Filser 21a3749086 Card Details Popup, Checklistitem Drag/Drop works in mobile view again 2021-10-21 09:46:05 +02:00
Martin Filser bd2b8625fb Set popupCard to null in router.js if currentCard is set to null 2021-10-21 09:26:29 +02:00
Martin Filser 7ced602be4 More robust logic if isMiniScreen or isShowDesktopDragHandles 2021-10-20 22:28:49 +02:00
Martin Filser b59e4d8fc7 Swimlade, List drag/drop now works again
happened at commit:
b9178cfcb6 isMiniScreen and showDesktopDragHandles centralized in class Utils
2021-10-20 22:28:49 +02:00
Lauri Ojansivu 9809510782 Updated translations. 2021-10-20 19:43:33 +03:00
Martin Filser ea7136816d Card Details Popup, edit dates now closes not the Popup 2021-10-20 18:41:33 +02:00
Martin Filser 73872202ec Card Details mobile view, copy link contains now the URL/id to the current card 2021-10-20 18:41:33 +02:00
Martin Filser a72f1ae8de Card Details Popup close, list moved to top -> fixed 2021-10-20 18:41:33 +02:00
Martin Filser fdf40f4584 Use Utils#getCurrentCard() everywhere in the code 2021-10-20 18:41:33 +02:00
Martin Filser 7a6cfcb498 Card Details Popup, Labels assign now works 2021-10-20 18:41:33 +02:00
Martin Filser 4994f23134 textarea, remove every whitespace at line end
- whitespaces aren't needed at the end of the line, that's why
  String.trim() is already implemented at input fields
2021-10-20 18:41:33 +02:00
Martin Filser 8c3ce4bb73 Card Details Popup possible on desktop view
- until now a new form in the popup closed the popup itself
2021-10-20 18:41:33 +02:00
Martin Filser 48b2e3dd88 Card Details in the new on mobile view have now the normal view again 2021-10-20 18:41:33 +02:00
Martin Filser bcb5cfb235 Card Details can be opened in a new tab on mobile view 2021-10-20 18:41:33 +02:00
Martin Filser 27213245ef Card Details Popup, Session variable popupCard is deleted on popup close 2021-10-20 18:41:33 +02:00
Martin Filser c07a1412f7 Card Details Popup and Sub-Popup's same look as the desktop view 2021-10-20 18:41:33 +02:00
Martin Filser dae58d11c2 Card Details Popup only opened if not another popup is opened yet
e.g. this Popup's didn't opened:
- card sorting number
- edit received date
2021-10-20 18:41:33 +02:00
Martin Filser fb66b84b58 Card Details, description edit is now saved at popup 2021-10-20 18:41:33 +02:00
Martin Filser 125c84b6b5 Card Details, Ctrl+Enter at description editing raised an error
Console:
Uncaught TypeError: can't access property "click", this.find(...) is null
2021-10-20 18:41:33 +02:00
Martin Filser 5f58ede7e3 Card Details Popup, edit of Checklist, Checklistitems and Description now works
- problem is that if a inlined-form is opened within a popup, the popup
  is closed first
2021-10-20 18:41:30 +02:00
Martin Filser 0f69282eec Card Details Popup, Activities (comments) are now displayed 2021-10-20 18:40:41 +02:00
Martin Filser 24b0613bac Card Details Popup, Checklist is now displayed 2021-10-20 18:40:41 +02:00
Martin Filser 4a87d5f0f3 Card Details Popup, Labels and Checklistitems were too much displayed at the "bottom" 2021-10-20 18:40:41 +02:00
Martin Filser 09b127b648 Card Details as Popup 2021-10-20 18:40:41 +02:00
Martin Filser 4ab290928c minicard, div has no colorClass if not defined 2021-10-20 18:40:41 +02:00
Martin Filser b9178cfcb6 isMiniScreen and showDesktopDragHandles centralized in class Utils
- a lot of same code everywhere in many files, this is against the
  concept "don't repeat yourself"
2021-10-20 18:40:41 +02:00
Lauri Ojansivu cbc6463019 Updated ChangeLog. 2021-10-20 19:39:16 +03:00
Lauri Ojansivu a30fee95bf Merge pull request #4060 from mfilser/popup_sorting_number
Popup sorting number
2021-10-20 19:37:06 +03:00
Martin Filser b1b2d87045 Minicard sort popup, Enter button saves the new sort number 2021-10-20 14:36:21 +02:00
Martin Filser 02896e669a Minicard, sort number can be edited in a popup 2021-10-20 14:36:21 +02:00
Martin Filser df5b76aa87 Card Details sorting, Enter = Save Button press 2021-10-20 14:36:21 +02:00
Christian Hillebrand ea60d5a205 Re-enables custom schemes auto linking 2021-10-20 12:35:01 +02:00
Lauri Ojansivu 02f056851d Try to fix api.py adddcustomfieldtoboard.
Thanks to xet7 !
2021-10-19 08:27:28 +03:00
Lauri Ojansivu d4cbcf1a31 Updated translations. 2021-10-19 07:50:56 +03:00
Lauri Ojansivu 78190d0d7e Updated ChangeLog. 2021-10-18 22:13:18 +03:00
Lauri Ojansivu 05ae1ad56d Merge pull request #4057 from Emile840/master
add full name if exists in email-invite-subject or when tagging someone with '@' while commenting a card
2021-10-18 22:10:52 +03:00
Emile NDAGIJIMANA 5a5a01cf17 [point #3830] Display default weekan logo if there isn't a custom one 2021-10-18 16:58:54 +02:00
Emile NDAGIJIMANA d9329a9e15 add full name if exists in email-invite-subject or when tagging someone with '@' while commenting a card 2021-10-18 15:26:01 +02:00
Lauri Ojansivu 3ea285498f Updated ChangeLog. 2021-10-16 19:09:35 +03:00
Lauri Ojansivu 3921209c9f api.py: Add Custom Fields to Board. Does not work yet, error: Settings must be object.
Thanks to xet7 !
2021-10-16 19:07:36 +03:00
Lauri Ojansivu 05e0aa0304 Updated ChangeLog. 2021-10-16 17:53:12 +03:00
Lauri Ojansivu 5c571ca863 api.py: Info of one Custom Field.
Thanks to xet7 !
2021-10-16 17:51:59 +03:00
Lauri Ojansivu 721e889bee Updated ChangeLog. 2021-10-16 17:43:10 +03:00
Lauri Ojansivu bcf3573131 api.py: List Custom Fields of Board.
Thanks to xet7 !
2021-10-16 17:41:18 +03:00
Lauri Ojansivu 153ce880dd Updated ChangeLog. 2021-10-16 16:52:36 +03:00
Lauri Ojansivu eac102dbbf api.py: Added "List All Public Boards".
Thanks to xet7 !
2021-10-16 16:50:47 +03:00
Lauri Ojansivu d9efdb0b88 Updated translations. 2021-10-16 15:22:53 +03:00
Lauri Ojansivu 3a583a92f9 Updated translations. 2021-10-16 15:19:43 +03:00
Lauri Ojansivu 187e147352 Updated translations. 2021-10-16 14:51:00 +03:00
Lauri Ojansivu 2c9439fd7b Update translations. 2021-10-16 14:49:28 +03:00
Lauri Ojansivu 2cefc55865 Updated translations. 2021-10-15 23:00:25 +03:00
Lauri Ojansivu 74d1e032f2 Updated ChangeLog. 2021-10-15 22:57:01 +03:00
Lauri Ojansivu eb2ec18add Merge pull request #4056 from Ben0it-T/master
Fix : Setting overtime not working #1893
2021-10-15 22:54:14 +03:00
Ben0it-T 3c6915e217 Fix : Setting overtime not working #1893 2021-10-15 21:40:20 +02:00
Lauri Ojansivu 629fa91fa0 Updated ChangeLog. 2021-10-13 19:09:18 +03:00
Lauri Ojansivu 516044f3c7 Merge pull request #4053 from mfilser/fix_infinite_loading_of_public_boards
Fix infinite loading of public boards
2021-10-13 19:06:22 +03:00
Martin Filser a47c0dd512 Infinite cards loading on public boards
Fixes: #4024
2021-10-13 13:44:17 +02:00
Martin Filser 1b06997001 Public boards loaded incompletly
seen at: #4024

Console:
Meteor.user().isBoardAdmin() is undefined
2021-10-13 13:44:17 +02:00
Martin Filser 458ec4c9a5 devcontainer, added cleanup files 2021-10-13 13:44:01 +02:00
Martin Filser f76b466fc4 docker-compose build failed of .devcontainer, folder tests is missing
output of docker-compose build before this change:

+ /home/wekan/.meteor/meteor build --directory /home/wekan/app_build
Errors prevented bundling:
While building the application:
error: Could not resolve meteor.mainModule "tests/main.js" in package.json (os)
error: Could not resolve meteor.mainModule "tests/main.js" in package.json
(web.browser)
error: Could not resolve meteor.mainModule "tests/main.js" in package.json
(web.browser.legacy)

The command '/bin/sh -c set -o xtrace &&     cd /home/wekan/app &&     /home/wekan/.meteor/meteor add standard-minifier-js &&     /home/wekan/.meteor/meteor npm install &&     /home/wekan/.meteor/meteor build --directory /home/wekan/app_build' returned a non-zero code: 1
2021-10-13 13:43:08 +02:00
Martin Filser d7479c742f docker-compose, set localization in docker containers
/etc/localtime and /etc/timezone are used for localization
2021-10-13 13:43:08 +02:00
Lauri Ojansivu b12312f998 Create release.yml 2021-10-12 23:58:35 +03:00
Lauri Ojansivu f8e5565b49 v5.65 2021-10-12 20:22:11 +03:00
Lauri Ojansivu 4a7718820c Updated translations. 2021-10-12 19:36:49 +03:00
Lauri Ojansivu c2d47cfcdb Updated ChangeLog. 2021-10-12 19:25:18 +03:00
Lauri Ojansivu 64fc2e5d8f Updated to Node.js v12.22.7. Thanks to Node.js developers. 2021-10-12 19:23:14 +03:00
Lauri Ojansivu 7c5763439c Updated ChangeLog. 2021-10-12 19:21:52 +03:00
Lauri Ojansivu d39e8bc03a Merge pull request #4052 from Emile840/master
Fix bug "if OIDC button text was customized, the default text will be added if a user click on 'sing in'"
2021-10-12 19:18:27 +03:00
Emile NDAGIJIMANA 6cd59f8ce1 Fix bug 'if OIDC button text was customized, the default text will be added if a user click on sing in' 2021-10-12 17:41:12 +02:00
Lauri Ojansivu 37a3fbf69c Updated translations. 2021-10-10 18:06:57 +03:00
Lauri Ojansivu 684fd8c2c5 Updated ChangeLog. 2021-10-10 12:15:34 +03:00
Lauri Ojansivu d481328b20 Merge pull request #4047 from Ben0it-T/master
Excel Export : fix add comments worksheet (#4045)
2021-10-10 12:10:15 +03:00
Ben0it-T e694c587e5 Excel Export : fix add comments worksheet (#4045) 2021-10-10 10:54:27 +02:00
Lauri Ojansivu 3125cefd41 v5.64 2021-10-09 14:42:03 +03:00
Lauri Ojansivu c27a622289 Update WeKan ® 2021-10-09 14:22:26 +03:00
Lauri Ojansivu 51875dc155 Updated translations. 2021-10-09 14:10:32 +03:00
Lauri Ojansivu f9bdfa54e7 Updated ChangeLog. 2021-10-09 14:04:19 +03:00
Lauri Ojansivu 8fbee23797 Merge pull request #4045 from Ben0it-T/master
Excel Export : add board description, add comments worksheet
2021-10-09 14:02:13 +03:00
Ben0it-T 153e4cc3fa Excel Export : add board description, add comments worksheet 2021-10-09 12:20:34 +02:00
Lauri Ojansivu 5a5d619b89 v5.63 2021-10-07 09:31:38 +03:00
Lauri Ojansivu 97c56baebb Updated ChangeLog. 2021-10-07 08:50:42 +03:00
Lauri Ojansivu 9c99c5c3ae Fixed SMTP by reverting MAIL_SERVICE changes.
Thanks to xet7 !

Fixes #4022,
fixes #4001,
fixes https://github.com/wekan/wekan/discussions/4030
2021-10-07 08:47:10 +03:00
Lauri Ojansivu 28d515436e Updated translations. 2021-10-07 08:46:32 +03:00
Lauri Ojansivu f70ec7f53c Updated translations. 2021-10-05 20:53:50 +03:00
Lauri Ojansivu 74825c099f Merge pull request #4031 from greenhost/allow-custom-kubernetes-labels
Allow setting custom kubernetes labels when using the helm chart
2021-10-05 20:51:00 +03:00
Arie Peterson 966670fe70 Allow setting custom kubernetes labels when using the helm chart 2021-10-05 11:36:24 +02:00
Lauri Ojansivu c406607fd2 v5.62 2021-10-04 18:22:09 +03:00
Lauri Ojansivu e812a3a087 Updated ChangeLog. 2021-10-04 18:14:22 +03:00
Lauri Ojansivu 9e6744d1e3 Added week numbers to dates at card, minicard, Custom Field dates, DatePicker and Calendar. Part 2.
Thanks to xet7 !
2021-10-04 18:13:00 +03:00
Lauri Ojansivu 835e3ef305 Updated translations. 2021-10-04 18:01:43 +03:00
Lauri Ojansivu ac658af462 Updated ChangeLog. 2021-10-04 17:52:23 +03:00
Lauri Ojansivu 6c3fcdcc4c Confirm Archive Card.
Thanks to xet7 !
2021-10-04 17:51:07 +03:00
Lauri Ojansivu 22cbd5097b Updated ChangeLog. 2021-10-04 15:37:27 +03:00
Lauri Ojansivu d06ac09485 Added week numbers to dates at card, minicard, Custom Field dates, DatePicker and Calendar.
Thanks to xet7 !
2021-10-04 15:34:32 +03:00
Lauri Ojansivu 94b67db78a Updated ChangeLog. 2021-10-03 17:17:30 +03:00
Lauri Ojansivu 5536525564 Removed extra quotes.
Thanks to xet7 !
2021-10-03 17:01:44 +03:00
Lauri Ojansivu e6c7463c03 Merge pull request #4028 from Ben0it-T/master
Export CSV, TSV and XLS
2021-10-03 14:33:28 +03:00
Ben0it-T 11bf4c7c07 Fix : export CSV, TSV and XLS translation
Feature : add export CSV with semicolon separator
2021-10-03 09:18:02 +02:00
Lauri Ojansivu bc9c7e5aa4 Updated ChangeLog. 2021-10-01 19:55:07 +03:00
Lauri Ojansivu 9a0f54f4fe Merge pull request #4026 from ilvar/fix-shrink-docker-image-size
Fix: clean up /tmp after Docker build
2021-10-01 19:52:54 +03:00
Lauri Ojansivu 3b6f3c58e1 Updated ChangeLog. 2021-10-01 19:52:08 +03:00
Lauri Ojansivu ff01c2a69f Merge pull request #4025 from ilvar/feature-rules-title-partial-match
Feature: allow word match for rules -> title filter
2021-10-01 19:48:16 +03:00
Arcady Chumachenko 1322c1fbbd Fix: clean up /tmp after Docker build; drastically reduces docker image size 280 -> 180 MB 2021-09-30 21:22:50 +01:00
Arcady Chumachenko 36e2c76456 Feature: allow word match for rules -> title filter; e.g. filter 'Foo' will now match both 'Foo' and 'Foo bar' 2021-09-30 21:19:47 +01:00
Lauri Ojansivu c42a8df65c v5.61 2021-09-25 18:30:24 +03:00
Lauri Ojansivu 01b38bb2e0 Updated translations. 2021-09-25 18:25:21 +03:00
Lauri Ojansivu 9f9a69286c Updated ChangeLog. 2021-09-25 18:20:01 +03:00
Lauri Ojansivu e3a0dea85f Fixed REST API, it shoud work now by Admin user.
Reverted Allow board members to use more of API of Wekan v5.35
https://github.com/wekan/wekan/commit/a719e8fda1f78bcbf9af6e7b4341f8be1d141e90

Thanks to tomhughes.

Fixes #4009,
fixes #2793,
fixes #2790
2021-09-25 18:09:18 +03:00
Lauri Ojansivu 5b5094ced6 Updated translations. 2021-09-23 22:33:11 +03:00
Lauri Ojansivu f5c2557338 Updated translations. 2021-09-22 19:54:13 +03:00
Lauri Ojansivu 802f1599a1 Updated ChangeLog. 2021-09-22 19:51:39 +03:00
Lauri Ojansivu 9781afa17e Merge branch 'Emile840-master' 2021-09-22 19:49:50 +03:00
Lauri Ojansivu 3319602f3f Merge branch 'master' of https://github.com/Emile840/wekan into Emile840-master 2021-09-22 19:48:30 +03:00
Emile NDAGIJIMANA 8bd2e4f0dd upgrade to wekan 5.60 2021-09-22 17:13:48 +02:00
Lauri Ojansivu 8eaa490664 v5.60 2021-09-22 17:13:48 +02:00
Lauri Ojansivu db54eb87cd Updated translations. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu d1950efdd4 Updated ChangeLog. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu cf51ddb32e Update build scripts to install npm from NodeSource, and meteor with npm.
Thanks to Meteor developers!
2021-09-22 17:13:48 +02:00
Lauri Ojansivu 269551ead5 Updated ChangeLog. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu ee06e4f6de Toggle opened card Custom Fields layout between Grid and one per row.
Thanks to xet7 !
2021-09-22 17:13:48 +02:00
Lauri Ojansivu 87e9949f33 Updated ChangeLog. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu 0b02e88ee3 Try to fix Bug: Card number equal to #0 when creating a sub-task from a card.
Thanks to marcungeschikts, olivierlambert and xet7 !

Fixes #3970
2021-09-22 17:13:48 +02:00
Lauri Ojansivu dd58698cef Updated translations. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu f9807bfad8 Updated ChangeLog. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu 4f6bd86478 Custom Fields at opened card below each other.
Thanks to xet7 !
2021-09-22 17:13:48 +02:00
Lauri Ojansivu be6ff3782b Updated translations. 2021-09-22 17:13:48 +02:00
Lauri Ojansivu 7ae2360a55 Updated translations. 2021-09-22 17:13:47 +02:00
Emile NDAGIJIMANA 1852e66abd Search by name, userName or email address when adding a new user to a board 2021-09-22 16:55:23 +02:00
Lauri Ojansivu 367b2370a5 v5.60 2021-09-22 17:12:20 +03:00
Lauri Ojansivu 640df0f4a5 Updated translations. 2021-09-22 17:07:38 +03:00
Lauri Ojansivu 37984a6f9a Updated ChangeLog. 2021-09-22 13:16:53 +03:00
Lauri Ojansivu c062621dd5 Update build scripts to install npm from NodeSource, and meteor with npm.
Thanks to Meteor developers!
2021-09-22 13:15:06 +03:00
Lauri Ojansivu 437a2ea0e2 Updated ChangeLog. 2021-09-22 12:17:20 +03:00
Lauri Ojansivu fc2fb9a081 Toggle opened card Custom Fields layout between Grid and one per row.
Thanks to xet7 !
2021-09-22 12:14:42 +03:00
Lauri Ojansivu 41d9ae92e6 Updated ChangeLog. 2021-09-21 22:49:03 +03:00
Lauri Ojansivu 4c659da533 Try to fix Bug: Card number equal to #0 when creating a sub-task from a card.
Thanks to marcungeschikts, olivierlambert and xet7 !

Fixes #3970
2021-09-21 22:46:32 +03:00
Lauri Ojansivu 21a9226c4a Updated translations. 2021-09-21 22:39:08 +03:00
Lauri Ojansivu ee2c167be4 Updated ChangeLog. 2021-09-21 22:10:52 +03:00
Lauri Ojansivu 09b5359c45 Custom Fields at opened card below each other.
Thanks to xet7 !
2021-09-21 22:09:23 +03:00
Lauri Ojansivu e55e8ef000 Updated translations. 2021-09-20 18:29:04 +03:00
Lauri Ojansivu bffd56f5fc Updated translations. 2021-09-20 14:46:30 +03:00
Lauri Ojansivu ac0d7bda1c Updated ChangeLog. 2021-09-18 21:43:19 +03:00
Lauri Ojansivu 2912e541a0 Merge branch 'master' of github.com:wekan/wekan 2021-09-18 21:40:09 +03:00
Lauri Ojansivu 442e6bf983 Updated Docker base image to newer Ubuntu.
Thanks to xet7 !
2021-09-18 21:39:34 +03:00
Lauri Ojansivu 70ba1eca78 Create docker-publish.yml 2021-09-18 20:46:00 +03:00
Lauri Ojansivu e925877ae4 Delete not working workflow 2021-09-18 20:44:25 +03:00
Lauri Ojansivu 0e7cc1ef87 Create docker-publish.yml 2021-09-18 20:41:43 +03:00
Lauri Ojansivu 909b0ef1b7 Updated ChangeLog. 2021-09-17 21:29:22 +03:00
Lauri Ojansivu a573083291 v5.59 2021-09-17 20:39:25 +03:00
Lauri Ojansivu 6a42f738c9 Updated ChangeLog. 2021-09-17 18:34:34 +03:00
Lauri Ojansivu 9bee6ae666 Sum of cards. In Progress. Part 2: Show option for custom field sum only for currency and number fields.
Thanks to xet7 !

Related #3796
2021-09-17 18:30:53 +03:00
Lauri Ojansivu 533af4b39e Updated translations. 2021-09-17 15:48:39 +03:00
Lauri Ojansivu 99a200d0b2 Updated ChangeLog. 2021-09-17 04:28:10 +03:00
Lauri Ojansivu 889ec1339a Try to fix: Can't delete attachment.
Thanks to luistiktok and xet7 !

Fixes #4012
2021-09-17 04:25:57 +03:00
Lauri Ojansivu 0bdc3d04b4 Updated ChangeLog. 2021-09-17 04:19:19 +03:00
Lauri Ojansivu bd9fbedbf9 At card attachments, show play and fullscreen controls for video webm/mp4/ogg, and play controls for audio mp3/ogg.
Thanks to luistiktok and xet7 !

Fixes #4013
2021-09-17 04:16:56 +03:00
Lauri Ojansivu 6c0a958481 Updated translations. 2021-09-16 23:47:40 +03:00
Lauri Ojansivu 45a39ec213 Updated ChangeLog. 2021-09-16 10:38:57 +03:00
Lauri Ojansivu 800304270e Merge pull request #4011 from Emile840/master
[Admin panel / Settings / Layout] Customize OIDC button text
2021-09-16 10:19:39 +03:00
Emile NDAGIJIMANA 9defed2680 [Admin panel / Settings / Layout] Customize OIDC button text 2021-09-15 18:35:09 +02:00
Lauri Ojansivu 7be9d7ff49 Updated ChangeLog. 2021-09-13 22:06:25 +03:00
Lauri Ojansivu 287abe7640 Merge branch 'Ben0it-T-master' 2021-09-12 16:47:18 +03:00
Ben0it-T 262df6c4a0 Fix : Linked card cannot change date #2930 2021-09-12 11:22:15 +02:00
Lauri Ojansivu 10e3d963ef Updated translations. 2021-09-10 22:33:29 +03:00
Lauri Ojansivu d23920c886 Updated ChangeLog. 2021-09-10 22:30:08 +03:00
Lauri Ojansivu be2647556d Merge branch 'Emile840-master' 2021-09-10 22:28:57 +03:00
Lauri Ojansivu ea57864bcc Merge branch 'master' of https://github.com/Emile840/wekan into Emile840-master 2021-09-10 22:16:57 +03:00
Emile NDAGIJIMANA 0c121a5894 update package-lock.json 2021-09-09 17:53:10 +02:00
Emile NDAGIJIMANA c19723ae27 Add / remove team members as board members when adding / removing team to a board 2021-09-09 16:51:37 +02:00
Lauri Ojansivu 00b43df267 Updated translations. 2021-09-08 16:08:05 +03:00
Lauri Ojansivu edb6355960 Updated ChangeLog. 2021-09-08 15:57:54 +03:00
Lauri Ojansivu 8626b466b8 Sum of cards. In Progress.
Thanks to xet7 !

Related #3796
2021-09-08 15:55:53 +03:00
Lauri Ojansivu a80ab6e47a Updated ChangeLog. 2021-09-08 14:57:15 +03:00
Lauri Ojansivu 2b2978b8e7 Merge pull request #3999 from helioguardabaxo/master
When list has just one card, to show 'card' instead of 'cards'
2021-09-08 14:49:09 +03:00
helioguardabaxo 3bdea42f6d Includes JS file to previous commit 2021-09-07 18:13:08 -03:00
helioguardabaxo b56ea161cd When list has just one card, to show 'card' instead of 'cards' 2021-09-07 18:09:40 -03:00
Lauri Ojansivu cde74a9c0b Removed extra files. 2021-09-07 01:13:19 +03:00
Lauri Ojansivu 79b00f88b0 Updated ChangeLog. 2021-09-07 00:11:25 +03:00
Lauri Ojansivu 0da84f8f3e Enter new password 2 times when registering.
Thanks to sh2515 and xet7 !

Fixes #2378
2021-09-07 00:08:45 +03:00
Lauri Ojansivu 4f164a46a6 Updated ChangeLog. 2021-09-06 23:38:15 +03:00
Lauri Ojansivu 3d9b7eb7ab Added some translations to: Admin Panel/People: Possibility of adding a team to all selected users.
Thanks to xet7.

Related https://github.com/wekan/wekan/pull/3996
2021-09-06 23:35:56 +03:00
Lauri Ojansivu d3eb0ced83 Fixed dependencies.
Thanks to xet7 !
2021-09-06 23:10:01 +03:00
Lauri Ojansivu 08ac1f6b69 Merge pull request #3996 from Emile840/master
[Admin panel / People] possibility of adding a team to all selected Users
2021-09-06 23:08:35 +03:00
Lauri Ojansivu cc63be8ff0 Updated translations. 2021-09-06 22:56:40 +03:00
Lauri Ojansivu b1d8b0c7d4 Updated ChangeLog. 2021-09-06 22:47:07 +03:00
Lauri Ojansivu 3f6fde033b Merge pull request #3994 from ww-daniel-mora/fix/issue-2444-OIDC-first-login
Fix first user creation for via OIDC
2021-09-06 22:44:31 +03:00
Emile NDAGIJIMANA 0a9e10b21e ['Version 5.58' Admin panel / People] possibility of adding a team to all selected Users 2021-09-06 21:43:38 +02:00
Lauri Ojansivu 25e17fedb9 Updated ChangeLog. 2021-09-06 22:41:09 +03:00
Lauri Ojansivu 8ec54ffa5b Merge pull request #3993 from garrison/devel-broken-links
Links to devel branch are broken; use master instead
2021-09-06 22:36:40 +03:00
Emile NDAGIJIMANA b516275c24 [Admin panel / People] possibility of adding a team to all selected Users 2021-09-06 17:38:03 +02:00
Daniel Mora aea5d62556 Fix first user creation for via OIDC
When setting up a new deploy and registering the first user via OIDC no profile information would be populated. This also prevented updating profile information as the client would error when encountering a null email value. I manually tested this change against the OIDC use case, but, not others. This fix should address #2444
2021-09-04 16:08:55 -04:00
Jim Garrison de2fc69315 Links to devel branch are broken; use master instead 2021-09-03 21:55:18 -04:00
Lauri Ojansivu 8629537c3f v5.58 2021-09-01 17:32:53 +03:00
Lauri Ojansivu 57401e48c1 Updated ChangeLog. 2021-09-01 16:29:10 +03:00
Lauri Ojansivu 76f4b8316b Merge branch 'Emile840-master' 2021-09-01 16:20:38 +03:00
Lauri Ojansivu ef0e4e36f4 Merge branch 'master' of https://github.com/Emile840/wekan into Emile840-master 2021-09-01 16:17:36 +03:00
Emile NDAGIJIMANA 55296b676b [After update wekan to 5.57] Edit profil and change pswd menus are not displayed when SSO authentication is used 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 5b9a2a8bac Updated ChangeLog. 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 8031b184f3 v5.57 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 1efd7bb33a Updated build scripts. 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 53d663f77b v5.56 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 9969523b70 Updated ChangeLog. 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 2cd0a414d5 Updated dependencies.
Thanks to developers of dependencies!
2021-09-01 14:43:14 +02:00
Lauri Ojansivu 256a673a7f v5.55 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 6d8a062e50 Updated ChangeLog. 2021-09-01 14:43:14 +02:00
Lauri Ojansivu 35a7159be4 Updated to Node.js v12.22.6. Thanks to Node.js developers. 2021-09-01 14:43:13 +02:00
Lauri Ojansivu 764d9fa806 Fix typo. 2021-09-01 14:43:13 +02:00
Lauri Ojansivu 292ff3c961 Updated translations. 2021-09-01 14:43:13 +02:00
Lauri Ojansivu 071929d3a6 Updated ChangeLog. 2021-09-01 14:43:13 +02:00
Emile NDAGIJIMANA c7cc9273a6 Edit profil and change password menus are not displayed when SSO authentication is used 2021-09-01 11:40:54 +02:00
Lauri Ojansivu 55a11a24f4 Updated ChangeLog. 2021-08-31 22:50:35 +03:00
Lauri Ojansivu d1f443bcd8 v5.57 2021-08-31 21:58:41 +03:00
Lauri Ojansivu 52fafe9976 Updated build scripts. 2021-08-31 21:54:31 +03:00
Lauri Ojansivu 9aa7b792be v5.56 2021-08-31 21:20:53 +03:00
Lauri Ojansivu 07e9fe3403 Updated ChangeLog. 2021-08-31 21:17:15 +03:00
Lauri Ojansivu 858967f420 Updated dependencies.
Thanks to developers of dependencies!
2021-08-31 21:15:08 +03:00
Lauri Ojansivu e07df35b61 v5.55 2021-08-31 20:58:17 +03:00
Lauri Ojansivu 2a3aa9331f Updated ChangeLog. 2021-08-31 19:21:25 +03:00
Lauri Ojansivu 4863689248 Updated to Node.js v12.22.6. Thanks to Node.js developers. 2021-08-31 19:19:24 +03:00
Lauri Ojansivu 8a53aa9fa4 Fix typo. 2021-08-30 19:13:28 +03:00
Lauri Ojansivu 57a990d91e Updated translations. 2021-08-30 19:02:40 +03:00
Lauri Ojansivu 76c0393c53 Updated ChangeLog. 2021-08-30 18:57:54 +03:00
Lauri Ojansivu 62d472fa54 Merge pull request #3981 from Emile840/master
Fix bugs #3978 and #3979
2021-08-30 18:53:14 +03:00
Emile NDAGIJIMANA 6d9d69e01d Fix bugs #3978 and #3979 2021-08-30 15:49:37 +02:00
Lauri Ojansivu 38666cbda2 v5.54 2021-08-28 01:50:03 +03:00
Lauri Ojansivu b3b81546f6 Updated translations. 2021-08-28 01:36:16 +03:00
Lauri Ojansivu 9c2151f802 Updated translations. 2021-08-28 01:26:01 +03:00
Lauri Ojansivu 1f2c4b5a9e Updated ChangeLog. 2021-08-28 01:19:24 +03:00
Lauri Ojansivu c9ef28b2ad Merge pull request #3977 from syndimann/fix/sub-task-card-numbers
Fix: Incorrect card numbers for sub tasks
2021-08-28 01:15:13 +03:00
Kai Lehmann 03a5f46131 fixes card numbers for sub tasks 2021-08-27 21:16:27 +02:00
Lauri Ojansivu f1e4297e00 Merge pull request #3976 from Emile840/master
[Admin panel] Added a parameter to display or not the visibility of a board in private mode only
2021-08-27 17:38:25 +03:00
Emile NDAGIJIMANA 9bb1425a81 [Admin panel] Add a parameter to display or not the visibility of a board in private mode only 2021-08-27 16:25:44 +02:00
Lauri Ojansivu b6277233a1 v5.53 2021-08-27 15:07:58 +03:00
Lauri Ojansivu 7bed8a7abb Updated ChangeLog. 2021-08-27 14:48:00 +03:00
Lauri Ojansivu 787df04419 Try to fix MAIL_FROM.
Thanks to xet7 !

Fixes #3972,
fixes #3975,
fixes #3969
2021-08-27 14:35:37 +03:00
Lauri Ojansivu 8e142dfdcf v5.52 2021-08-26 13:55:05 +03:00
Lauri Ojansivu 2a216d41f0 Updated ChangeLog. 2021-08-26 04:05:35 +03:00
Lauri Ojansivu 241eb9df0f Fixed New wide card edit view is all jumbled on mobile.
Thanks to jdaviescoates and xet7 !

Fixes #3890
2021-08-26 04:01:44 +03:00
Lauri Ojansivu 0bdd7c8973 Updated ChangeLog. 2021-08-26 03:41:10 +03:00
Lauri Ojansivu a59932af00 Fixed Save button not clickable in maximized card view.
Thanks to syndimann !

Fixes #3940
2021-08-26 03:38:31 +03:00
Lauri Ojansivu c2a073dec0 Updated ChangeLog. 2021-08-26 03:03:15 +03:00
Lauri Ojansivu 7808fdd22f Delete user is now possible at Admin Panel. But you should remove user first from all boards,
because otherwise there could be bug of empty avatars at boards, that need to be removed manually
from database.

Thanks to xet7 !

Fixes #3956
2021-08-26 02:57:49 +03:00
Lauri Ojansivu bf2f3ccec1 Updated ChangeLog. 2021-08-26 02:39:39 +03:00
Lauri Ojansivu 9c7c481f48 Initials not required for new user that is created at Admin Panel.
Thanks to xet7 !
2021-08-26 02:36:43 +03:00
Lauri Ojansivu df26bc9013 Updated ChangeLog. 2021-08-26 02:12:47 +03:00
Lauri Ojansivu b36a7621e0 Fixed translation of "Clear Filter" for "All boards page: Possibility of filtering board by team or organization".
Thanks to xet7 !
2021-08-26 02:10:44 +03:00
Lauri Ojansivu f2c242f49e Added Chinese (Simplified) (zh-Hans or zh-CN).
Thanks to translators!
2021-08-26 02:08:23 +03:00
Lauri Ojansivu 5175f13881 Updated ChangeLog. 2021-08-25 23:32:35 +03:00
Lauri Ojansivu 75a1854cc3 Merge pull request #3964 from Emile840/master
[All boards page] Possibility of filtering board by team or organization
2021-08-25 23:29:49 +03:00
Emile NDAGIJIMANA 48c3263e28 [all boards page] Possibility of filtering board by team or organization 2021-08-24 17:12:51 +02:00
Lauri Ojansivu f5e26fb2e6 Updated ChangeLog. 2021-08-21 17:55:49 +03:00
Lauri Ojansivu 1fadf204c2 Added MAIL_SERVICE settings. Part 2.
Thanks to xet7 !

Fixes #3702
2021-08-21 17:54:05 +03:00
Lauri Ojansivu f03b14a46b Updated ChangeLog. 2021-08-21 17:10:04 +03:00
Lauri Ojansivu ab8e56e16a Added MAIL_SERVICE settings for Well Known Email Services https://github.com/wekan/wekan/wiki/Troubleshooting-Mail . Please test.
Thanks to xet7 !

Fixes #3702
2021-08-21 16:32:07 +03:00
Lauri Ojansivu 2f33a1ecff v5.51 2021-08-17 22:04:39 +03:00
Lauri Ojansivu abadeb5e14 Updated ChangeLog. 2021-08-17 21:37:15 +03:00
Lauri Ojansivu 19c68895e9 Merge pull request #3949 from syndimann/fix/global-search
Fix: global search
2021-08-17 21:33:05 +03:00
Kai Lehmann bed6d6c591 fixes global search, remove unnecessary use of CardCommentReactions 2021-08-17 16:14:50 +02:00
Lauri Ojansivu b2652edf56 v5.50 2021-08-16 00:00:06 +03:00
Lauri Ojansivu 94bb3bee77 Updated translations. 2021-08-15 23:53:29 +03:00
Lauri Ojansivu e909ece2da Updated ChangeLog. 2021-08-15 23:48:16 +03:00
Lauri Ojansivu 7bc250ce84 Merge pull request #3946 from syndimann/fix/user-creation
Fix: Save user initials and fullname when a new user is created
2021-08-15 23:44:07 +03:00
Kai Lehmann 7706839fbe fix user creation to include fullname and initials 2021-08-15 22:33:31 +02:00
Lauri Ojansivu 68ad58431d Updated translations. 2021-08-15 00:02:02 +03:00
Lauri Ojansivu 2059752fc6 Updated translations. 2021-08-14 09:51:30 +03:00
Lauri Ojansivu 302afae0bb Updated dependencies. 2021-08-14 09:44:07 +03:00
Lauri Ojansivu 3d1d94d628 Updated ChangeLog. 2021-08-13 23:54:24 +03:00
Lauri Ojansivu d51fc2f12c v5.49 2021-08-13 23:36:36 +03:00
Lauri Ojansivu 2dee14b0d5 Updated translations. 2021-08-13 23:24:07 +03:00
Lauri Ojansivu e75849da98 Updated translations. 2021-08-13 22:49:46 +03:00
Lauri Ojansivu 508c7b7a90 Merge pull request #3945 from syndimann/master
Feature: Adds Card Comment Reactions
2021-08-13 22:27:10 +03:00
Lauri Ojansivu de67e051d7 Updated ChangeLog. 2021-08-13 22:26:36 +03:00
Lauri Ojansivu 9ce65c601a Text "Search" now translatable at Card Add Member/Assignee.
Thanks to xet7 !
2021-08-13 22:23:50 +03:00
Kai Lehmann 10d7eeb762 Merge branch 'wekan:master' into master 2021-08-13 21:03:55 +02:00
Kai Lehmann 104a6dd0b3 add comments for card comment reactions feature 2021-08-13 20:53:04 +02:00
Kai Lehmann 2977120129 adds card comment reactions feature 2021-08-13 20:47:55 +02:00
Kai Lehmann d8e8512d66 add i18n for add-reaction 2021-08-13 20:43:30 +02:00
Lauri Ojansivu 7bfbcf7e03 v5.48 2021-08-11 23:48:02 +03:00
Lauri Ojansivu 91cad7b49e Updated to Node.js v12.22.5. Thanks to Node.js developers. 2021-08-11 23:40:56 +03:00
Lauri Ojansivu 26f1defc56 Updated ChangeLog. 2021-08-11 23:16:27 +03:00
Lauri Ojansivu 9a03654062 Fixed: Can't save user without Initials.
Thanks to devagleo and xet7 !

Fixes #3928
2021-08-11 23:14:18 +03:00
Lauri Ojansivu 2576ef75bd Updated dependencies.
Thanks to developers of dependencies!
2021-08-11 23:11:50 +03:00
Lauri Ojansivu 752b45af42 Updated ChangeLog. 2021-08-11 23:11:34 +03:00
Lauri Ojansivu 23c70ac252 Added new translation: [French (Switzerland) (fr_CH).
Thanks to translators!
2021-08-11 23:10:20 +03:00
Lauri Ojansivu ad4de9e85d Updated dependencies. 2021-08-11 22:10:59 +03:00
Lauri Ojansivu 855d60f28e Merge branch 'master' of github.com:wekan/wekan 2021-08-11 22:07:23 +03:00
Lauri Ojansivu 781a94c05f Updated ChangeLog. 2021-08-11 22:06:56 +03:00
Lauri Ojansivu b3cc01b041 Updated dependencies.
Thanks to developers of dependencies!
2021-08-11 22:05:17 +03:00
Lauri Ojansivu e23ced47ae Merge pull request #3944 from wekan/dependabot/npm_and_yarn/jszip-3.7.0
Bump jszip from 3.6.0 to 3.7.0
2021-08-11 21:33:39 +03:00
dependabot[bot] f406b51a5f Bump jszip from 3.6.0 to 3.7.0
Bumps [jszip](https://github.com/Stuk/jszip) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/Stuk/jszip/releases)
- [Changelog](https://github.com/Stuk/jszip/blob/master/CHANGES.md)
- [Commits](https://github.com/Stuk/jszip/compare/v3.6.0...v3.7.0)

---
updated-dependencies:
- dependency-name: jszip
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-11 18:32:04 +00:00
Lauri Ojansivu c81cb786ed Updated version. 2021-08-11 21:28:18 +03:00
Lauri Ojansivu 846f1244c7 Updated ChangeLog. 2021-08-11 21:04:45 +03:00
Lauri Ojansivu 3ea723329a Merge pull request #3942 from syndimann/feature/searchable-members-in-card-popup
Feature: Searchfields for members and assignees card popups
2021-08-11 21:02:06 +03:00
Kai Lehmann 698c9ed1ea adds searchfields to members and assignees popup 2021-08-10 21:20:16 +02:00
Lauri Ojansivu 63044ac13a v5.47 2021-08-05 00:49:00 +03:00
Lauri Ojansivu 68d9de8946 Updated dependencies. 2021-08-05 00:42:50 +03:00
Lauri Ojansivu 92a7717e50 v5.46 2021-08-05 00:33:22 +03:00
Lauri Ojansivu d5c0a5d377 Updated dependencies. 2021-08-05 00:26:54 +03:00
Lauri Ojansivu c0b7fb0b84 v5.45 2021-08-05 00:24:29 +03:00
Lauri Ojansivu 9b4e556837 Updated ChangeLog. 2021-08-05 00:13:08 +03:00
Lauri Ojansivu 1aec0b5f0d Merge pull request #3939 from syndimann/bugfix/3866-mentions-in-maximized-card
Fix: Show missing user mentions popover when posting comments in maximized card layout
2021-08-05 00:10:56 +03:00
Lauri Ojansivu c5d4e06ea3 Updated ChangeLog. 2021-08-05 00:10:14 +03:00
Lauri Ojansivu 97bf907448 Merge pull request #3937 from syndimann/feature/card-and-board-mentions
Feature: Special handles to notify board or card members in a comment
2021-08-05 00:08:43 +03:00
Kai Lehmann 7ef2a2a9f4 fixes missing user mentions when in maximized card 2021-08-04 22:22:59 +02:00
Kai Lehmann 547d82fe57 adds handles to notifiy board or card members 2021-08-03 23:35:12 +02:00
303 changed files with 10815 additions and 10617 deletions

No files matched your search

+18 -1
View File
@@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive
ENV \
DEBUG=false \
NODE_VERSION=v12.22.4 \
NODE_VERSION=v12.22.7 \
METEOR_RELEASE=1.10.2 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
@@ -195,6 +195,10 @@ COPY \
settings.json \
/home/wekan/app/
COPY \
tests \
/home/wekan/app/tests/
COPY \
packages \
/home/wekan/app/packages/
@@ -226,6 +230,19 @@ RUN \
chmod u+w package.json npm-shrinkwrap.json && \
npm install
USER root
# Cleanup
RUN \
set -o xtrace && \
apt-get clean -y && \
apt-get autoremove -y && \
rm -Rf /tmp* && \
rm -Rf /home/wekan/app_build && \
rm -Rf /var/cache/apt /var/lib/apt/lists && \
rm -Rf /var/lib/apt/lists/*
USER wekan
ENV PORT=3000
EXPOSE $PORT
WORKDIR /home/wekan/app
+8 -3
View File
@@ -12,9 +12,10 @@ services:
expose:
- 27017
volumes:
- ./volumes/wekan-db:/data/db
- ./volumes/wekan-db-dump:/dump
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- wekan-db:/data/db
- wekan-db-dump:/dump
wekan-dev:
container_name: wekan-dev-app
@@ -36,19 +37,23 @@ services:
depends_on:
- wekandb-dev
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ../client:/home/wekan/app/client
- ../models:/home/wekan/app/models
- ../config:/home/wekan/app/config
- ../i18n:/home/wekan/app/i18n
- ../server:/home/wekan/app/server
- ../public:/home/wekan/app/public
- /etc/localtime:/etc/localtime:ro
- wekan-tmp:/tmp
volumes:
wekan-dev-db:
driver: local
wekan-dev-db-dump:
driver: local
wekan-tmp:
driver: local
networks:
wekan-dev-tier:
+2
View File
@@ -122,6 +122,7 @@
"Activities": true,
"Attachments": true,
"Boards": true,
"CardCommentReactions": true,
"CardComments": true,
"DatePicker": true,
"Cards": true,
@@ -156,6 +157,7 @@
"Integrations": true,
"HTTP": true,
"AccountSettings": true,
"TableVisibilityModeSettings": true,
"Announcements": true,
"Swimlanes": true,
"ChecklistItems": true,
+1 -1
View File
@@ -81,7 +81,7 @@ parts:
wekan:
source: .
plugin: nodejs
node-engine: 12.22.4
node-engine: 12.22.7
node-packages:
- node-gyp
- node-pre-gyp
+1 -1
View File
@@ -83,7 +83,7 @@ parts:
wekan:
source: .
plugin: nodejs
node-engine: 12.22.4
node-engine: 12.22.7
node-packages:
- node-gyp
- node-pre-gyp
+7 -8
View File
@@ -1,12 +1,13 @@
## Issue
Note: With Docker, please don't use latest tag. Only use release tags.
See https://github.com/wekan/wekan/issues/3874
**[PLEASE UPGRADE](https://github.com/wekan/wekan/wiki/Backup)** to newest WeKan ® before adding new issue !!
- We get too many duplicate reports of already fixed bugs. Newest WeKan ® has newest bugfixes and security fixes.
- Please search existing Open and Closed issues, most questions have already been answered many times.
If you can not login for any reason:
- https://github.com/wekan/wekan/wiki/Forgot-Password
Email settings:
Email settings, only SMTP MAIL_URL and MAIL_FROM are in use:
- https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
Add these issues to elsewhere:
@@ -20,14 +21,12 @@ Other Wekan issues can be added here.
* Note: Please anonymize info, and do not add to this public issue any of your Wekan board URLs, passwords, API tokens etc, do you understand?:
* Did you test in newest Wekan?:
* For new Wekan install, did you configure root-url correctly so Wekan cards open correctly https://github.com/wekan/wekan/wiki/Settings ?
* Wekan version:
* If this is about old version of Wekan, what upgrade problem you have?:
* Operating System:
* Deployment Method(snap/docker/sandstorm/mongodb bundle/source):
* Deployment Method(Snap/Docker/Sandstorm/bundle/source):
* Http frontend if any (Caddy, Nginx, Apache, see config examples from Wekan GitHub wiki first):
* Node Version:
* Node.js Version:
* MongoDB Version:
* Wekan only works on newest desktop Firefox/Chromium/Chrome/Edge/Chromium Edge and mobile Chrome. What webbrowser version are you using?
* Wekan works on newest desktop and mobile webbrowsers that support Javascript. What webbrowser version are you using?
**Problem description**:
- *REQUIRED: Add recorded animated gif about how it works currently, and screenshot mockups how it should work. Use peek to record animgif in Linux https://github.com/phw/peek*
+63
View File
@@ -0,0 +1,63 @@
name: Docker
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on:
schedule:
- cron: '28 23 * * *'
push:
branches: [ master ]
# Publish semver tags as releases.
tags: [ 'v*.*.*' ]
pull_request:
branches: [ master ]
env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v2
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
+25
View File
@@ -0,0 +1,25 @@
name: Release Charts
on:
push:
branches:
- master
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Configure Git
run: |
git config user.name "$GITHUB_ACTOR"
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Run chart-releaser
uses: helm/chart-releaser-action@v1.1.0
env:
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+1 -1
View File
@@ -64,7 +64,7 @@ mquandalle:jquery-ui-drag-drop-sort
mquandalle:mousetrap-bindglobal
peerlibrary:blaze-components@=0.15.1
templates:tabs
verron:autosize
meteor-autosize
simple:json-routes
rajit:bootstrap3-datepicker
shell-server@0.5.0
+1 -1
View File
@@ -219,7 +219,7 @@ url@1.3.2
useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
useraccounts:unstyled@1.14.2
verron:autosize@3.0.8
meteor-autosize@5.0.1
webapp@1.10.1
webapp-hashing@1.1.0
wekan-accounts-cas@0.1.0
+1 -1
View File
@@ -3,7 +3,7 @@ sudo: required
env:
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
TRAVIS_NODE_VERSION: 12.22.4
TRAVIS_NODE_VERSION: 12.22.7
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_CH:de-CH, en_IT:en-IT, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_HK:zh-HK
lang_map = ar_EG:ar-EG, bg_BG:bg, de_CH:de-CH, en_IT:en-IT, en_GB:en-GB, es_AR:es-AR, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el, fa_IR:fa-IR, fi_FI:fi, fr_CH:fr-CH, hu_HU:hu, id_ID:id, mn_MN:mn, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, sl_SI:sl, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK
[wekan.application]
file_filter = i18n/<lang>.i18n.json
+529 -5
View File
@@ -1,7 +1,531 @@
[Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac)
Note: With Docker, please don't use latest tag. Only use release tags.
See https://github.com/wekan/wekan/issues/3874
# v5.73 2021-11-11 WeKan ® release
This release adds the following new features:
- [Added NodeJS Statistics to Admin Panel/Versio](https://github.com/wekan/wekan/pull/4118).
Thanks to Ben0it-T.
- [Card detail popup loads now comments if opened from board search](https://github.com/wekan/wekan/pull/4128).
Thanks to mfilser.
and adds the following updates:
- Updated dependencies
[Part 1](https://github.com/wekan/wekan/commit/cf6713a31c9f6ce9d30832ee6bf6c95d35d7044b),
[Part 2](https://github.com/wekan/wekan/commit/ac7ef4d4cd7179a140f0c56c7c7d1ffc33e75fbe).
Thanks to developers of dependencies.
and fixes the following bugs:
- [Card Details, add missing hr line before Activity title](https://github.com/wekan/wekan/pull/4117).
Thanks to Ben0it-T.
- [Sidebar search only opens the card as popup on mobile view](https://github.com/wekan/wekan/pull/4122).
Thanks to mfilser.
- [Fixed a bug related to the default text of the OIDC button](https://github.com/wekan/wekan/pull/4132).
Thanks to Emile840.
- [Fix: Impossible to export board to excel where title exceeding 31 chars](https://github.com/wekan/wekan/pull/4135).
Thanks to Ben0it-T.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.72 2021-10-31 WeKan ® release
This release adds the following new features:
- [Add a possibility for non-admin users (who have an email on a given domain name in Admin Panel) to invite new users for registration](https://github.com/wekan/wekan/pull/4107).
Thanks to Emile840.
and fixes the following bugs:
- [Try to fix: Filter List by Title - Hide empty lists in Swimlane view](https://github.com/wekan/wekan/pull/4108).
Thanks to Ben0it-T.
- [Card labels on minicard withouth text are now at the same line again](https://github.com/wekan/wekan/pull/4109).
Thanks to mfilser.
- [Rename "Domaine" to "Domain" that is more like English](https://github.com/wekan/wekan/commit/c136033c1fb25688d310b1b62841003f3901641a).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.71 2021-10-29 WeKan ® release
This release adds the following updates:
- [Updated dependencies](https://github.com/wekan/wekan/commit/df2a2aae1d44ba22563cc28bc8d9baac71b2ced7).
Thanks to developers of dependencies.
and fixes the following bugs:
- [Fix: Filter List by Card Title](https://github.com/wekan/wekan/pull/4105).
Thanks to Ben0it-T.
- Add info about upgrades to GitHub issue template.
[Part 1](https://github.com/wekan/wekan/commit/46a5eec7d21b66eb1aacac4fec84a0d0a0f4d16b),
[Part 2](https://github.com/wekan/wekan/commit/7cc35970a849c19d35b89cf0a5fb91216a66fcb3).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.70 2021-10-28 WeKan ® release
This release fixes the following bugs:
- [Fix bug related to Admin Panel teams management](https://github.com/wekan/wekan/pull/4103).
Thanks to Emile840.
- Docker: Try to fix "Failed export and unexpected container restart". Added timezone and localtime.
[Part 1](https://github.com/wekan/wekan/commit/ec33d0b34f3abe5634be0b87f03314c738c771d1),
[Part 2](https://github.com/wekan/wekan/commit/e3292dd5627f95d59d130a8c1b9a62df317ae6bd).
Thanks to akitzing, mfilser and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.69 2021-10-28 WeKan ® release
This release adds the following updates:
- [Updated Docker base image to Ubuntu 21.10 Impish](https://github.com/wekan/wekan/commit/5411113544f040cab2df86234745e4846029660f).
Thanks to Ubuntu developers.
and fixes the following bugs:
- [Fix Docs: Only MAIL_URL and MAIL_FROM for email settings. Not Admin Panel anymore](https://github.com/wekan/wekan/commit/d9adce7b676b705da786eb44cd2c2c4dba120d30).
Thanks to niklasdahlheimer.
- [Popup fixes: Archive cards, upload attachements etc](https://github.com/wekan/wekan/pull/4101).
Thanks to mfilser.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.68 2021-10-27 WeKan ® release
This release adds the following new features:
- [Labels are now drag/drop/sortable](https://github.com/wekan/wekan/pull/4084).
Thanks to mfilser.
and fixes the following bugs:
- [Fix labels desktop view add and delete](https://github.com/wekan/wekan/pull/4087).
Thanks to mfilser.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.67 2021-10-27 WeKan ® release
This release fixes the following bugs:
- [Fix typo](https://github.com/wekan/wekan/commit/cb9b8d4f2b8e24475a2aafd6f9653f28f305eefb).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.66 2021-10-27 WeKan ® release
This release adds the following new features:
- [api.py: List All Public Boards](https://github.com/wekan/wekan/commit/eac102dbbf302ccc121bbf1e4e8faf115e1f9da8).
Thanks to xet7.
- [api.py: List Custom Fields of Board](https://github.com/wekan/wekan/commit/bcf35731316c327090a8513a4c4094e32e301e3f).
Thanks to xet7.
- [api.py: Info of one Custom Field](https://github.com/wekan/wekan/commit/5c571ca8638c29e558f3a196daf5458274eb715e).
Thanks to xet7.
- [api.py: Add Custom Fields to Board. Does not work yet, error: Settings must be object](https://github.com/wekan/wekan/commit/3921209c9fbf1d908f2ef3e97dade5863a000309).
Thanks to xet7.
- [Add full name if exists in email-invite-subject or when tagging someone with `@` while commenting a card](https://github.com/wekan/wekan/pull/4057).
Thanks to Emile840.
- [Popup sorting number](https://github.com/wekan/wekan/pull/4060).
Thanks to mfilser.
- [At mobile view the card details are opened as Popup](https://github.com/wekan/wekan/pull/4062).
Thanks to mfilser.
- [Add card button has now a cancel button](https://github.com/wekan/wekan/pull/4067).
Thanks to mfilser.
- [Global search checklistitems and custom fields boolean](https://github.com/wekan/wekan/pull/4074).
Thanks to mfilser.
- [Board View, sort cards button also in mobile view](https://github.com/wekan/wekan/pull/4076).
Thanks to mfilser.
- [Minicard label popup](https://github.com/wekan/wekan/pull/4079).
Thanks to mfilser.
- [Re-enables custom schemes auto linking](https://github.com/wekan/wekan/commit/f67a174c4a7706a2d419ba3dd43d696104f90696).
Thanks to chrisi51.
- [Board search remove limit](https://github.com/wekan/wekan/pull/4082).
Thanks to mfilser.
- [Add a possibility of selecting displayed users in Admin Panel](https://github.com/wekan/wekan/pull/4083).
Thanks to Emile840.
and adds the following updates:
- Updated dependencies.
[Part 1](https://github.com/wekan/wekan/commit/f14e710ac0d5381ec092c9f383b9b68f446cab4d),
[Part 2](https://github.com/wekan/wekan/commit/156c0b5d4d91dae2ee9b12ed8c312dc19a3c3075).
Thanks to developers of dependencies.
- [Added npm publish script for releases](https://github.com/wekan/wekan/commit/2666b30ba911da8502153be5827f277b81354f8b).
Thanks to xet7.
and fixes the following bugs:
- [Fix infinite loading of public boards](https://github.com/wekan/wekan/pull/4053).
Thanks to mfilser.
- [Fix: Setting overtime not working](https://github.com/wekan/wekan/pull/4056).
Thanks to Ben0it-T.
- [Fix main scrollbar](https://github.com/wekan/wekan/pull/4063).
Thanks to mfilser.
- [Try to fix orphanedAttachments](https://github.com/wekan/wekan/commit/6a06522777a0bfa2f758e96c2d25e1237a7b43dc).
Thanks to Madko and xet7.
- [Fix markdown header quick access](https://github.com/wekan/wekan/pull/4065).
Thanks to mfilser.
- [Fix Filter List by Card Title](https://github.com/wekan/wekan/pull/4066).
Thanks to Ben0it-T.
- [Fix long textarea editing](https://github.com/wekan/wekan/pull/4068).
Thanks to mfilser.
- [Boards weren't loaded because of missing filter](https://github.com/wekan/wekan/pull/4069).
Thanks to mfilser.
- [Fix Card details Custom Fields popup empty hr sections and plus icon](https://github.com/wekan/wekan/pull/4070).
Thanks to mfilser.
- [Card popup search and global search improvements](https://github.com/wekan/wekan/pull/4071).
Thanks to mfilser.
- [Comment out showing Search All Boards logs in console](https://github.com/wekan/wekan/commit/a62a177fb1cdf8b823b5c32380a81e803e0049e7).
Thanks to mfilser and xet7.
- [Long labels on card and minicard are wrapped if too long](https://github.com/wekan/wekan/pull/4073).
Thanks to mfilser.
- [Card dates, if deleted rules didn't apply on "unset date fields"](https://github.com/wekan/wekan/pull/4075).
Thanks to mfilser.
- [Comment, added confirm delete popup](https://github.com/wekan/wekan/pull/4077).
Thanks to mfilser.
- [Fix: Filter List by Card Title](https://github.com/wekan/wekan/pull/4078).
Thanks to Ben0it-T.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.65 2021-10-12 WeKan ® release
This release adds to following CRITICAL SECURITY UPDATES:
- [Updated to Node.js v12.22.7](https://github.com/wekan/wekan/commit/64fc2e5d8fe50115175d44c01f7fca4e668c7231).
Thanks to Node.js developers.
and fixes the following bugs:
- [Excel Export: Export only comments for cards that are not linked](https://github.com/wekan/wekan/pull/4047).
Thanks to Ben0it-T.
- [If OIDC button text was customized, the default text will be added if a user click on `Sign In`](https://github.com/wekan/wekan/pull/4052).
Thanks to Emile840.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.64 2021-10-09 WeKan ® release
This release adds the following new features:
- [Excel Export : add board description, add comments worksheet](https://github.com/wekan/wekan/pull/4045).
Thanks to Ben0it-T.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.63 2021-10-07 Wekan release
This release adds the following new features:
- [Allow setting custom kubernetes labels when using the helm chart](https://github.com/wekan/wekan/pull/4031).
Thanks to ariep.
and fixes the following bugs:
- [Fixed SMTP by reverting MAIL_SERVICE changes](https://github.com/wekan/wekan/commit/9c99c5c3ae8d291df5305b3b6cd1825fc5cc2c21).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.62 2021-10-04 Wekan release
This release adds the following new features:
- [Allow word match for rules -> title filter](https://github.com/wekan/wekan/pull/4025).
Thanks to ilvar.
- [CSV/TSV/Excel Export translatable and fixed, CSV semicolon option added](https://github.com/wekan/wekan/pull/4028).
Thanks to Ben0it-T.
- Added week numbers to dates at card, minicard, Custom Field dates, DatePicker and Calendar.
[Part 1](https://github.com/wekan/wekan/commit/d06ac09485dafb0256ae7fbe613ab2dbe00b70f3),
[Part 2](https://github.com/wekan/wekan/commit/9e6744d1e33b37e0d23eea5869ccac3ff37f7d53).
Thanks to xet7.
- [Confirm Archive Card](https://github.com/wekan/wekan/commit/6c3fcdcc4c446fd4c8dc4dca1b2846f6e3ea72e4).
Thanks to xet7.
and fixes the following bugs:
- [Clean up /tmp after Docker build. This drastically reduces docker image size from ~280 MB to ~180 MB](https://github.com/wekan/wekan/pull/4026).
Thanks to ilvar.
- [Removed extra quotes from Export menu](https://github.com/wekan/wekan/commit/553652556468ac88c0691d4d688d5a922ef6a0c2).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.61 2021-09-25 Wekan release
This release adds the following new features:
- [Search by name or username or emails address when adding a new user to a board](https://github.com/wekan/wekan/pull/4018).
Thanks to Emile840.
and fixes the following bugs:
- [Fixed REST API, it shoud work now by Admin user](https://github.com/wekan/wekan/commit/e3a0dea85fa1f8e2f580f419b30cf5f36775d731).
Reverted [Allow board members to use more of API of Wekan v5.35](https://github.com/wekan/wekan/commit/a719e8fda1f78bcbf9af6e7b4341f8be1d141e90).
Thanks to tomhughes and xet7.
- [Wekan Gantt GPL: Fix Tasks not displayed in Gantt screen](https://github.com/wekan/wekan-gantt-gpl/commit/72d464f5eb55501f08eb0cfd31fd5340380d7f3b).
Thanks to MrLovegreen and khjde1207.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.60 2021-09-22 Wekan release
This release adds the following new features:
- [Toggle opened card Custom Fields layout between Grid and one per row](https://github.com/wekan/wekan/commit/fc2fb9a081021663cc822bf2a687fda74cd0afa6).
Thanks to xet7.
and adds the following updates:
- [Updated Docker base image to newer Ubuntu](https://github.com/wekan/wekan/commit/442e6bf983ada47c26a15dbc1982c554118fa84d).
Thanks to xet7.
- [Try to add Docker image to GitHub Docker Image Registry](https://github.com/wekan/wekan/commit/70ba1eca787671879215726c16335a84e2b636c9).
Thanks to xet7.
- [Update build scripts to install npm from NodeSource, and meteor with npm](https://github.com/wekan/wekan/commit/c062621dd5486b60bdd200a9279a38b98fc0d410).
Thanks to Meteor developers.
and fixes the following bugs:
- [Try to fix Bug: Card number equal to #0 when creating a sub-task from a card](https://github.com/wekan/wekan/commit/4c659da5334641f558e77285f7ca47e562f7c853).
Thanks to marcungeschikts, olivierlambert and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.59 2021-09-17 Wekan release
This release adds the following new features:
- [Admin Panel/People: Possibility of adding a team to all selected users](https://github.com/wekan/wekan/pull/3996).
Thanks to Emile840.
- [Add / remove team members as board members when adding / removing team from board](https://github.com/wekan/wekan/pull/4000).
Thanks to Emile840.
- [Added more translations to: Admin Panel/People: Possibility of adding a team to all selected users](https://github.com/wekan/wekan/commit/3d9b7eb7ab41c6450b473f6f349d894f516c5487).
Thanks to xet7.
- [Enter new password 2 times when registering](https://github.com/wekan/wekan/commit/0da84f8f3eb91c5bf726e058f5ec74a7891d734b).
Thanks to sh2515 and xet7.
- Sum of cards. In Progress, not ready yet.
[Part 1: Add Custom Field options for field sum](https://github.com/wekan/wekan/commit/8626b466b830adf6c671211bbd61b53b96ac5a49).
[Part 2: Show option for custom field sum only for currency and number custom fields](https://github.com/wekan/wekan/commit/9bee6ae6663a5e1c974de2811f6a5fdd2d66efe5).
Thanks to xet7.
- [Admin Panel/Settings/Layout: Customize OIDC button text](https://github.com/wekan/wekan/pull/4011).
Thanks to Emile840.
- [At card attachments, show play and fullscreen controls for video webm/mp4/ogg, and play controls for audio mp3/ogg](https://github.com/wekan/wekan/commit/bd9fbedbf9fbe0181913876b930b335261cd2a0a).
Thanks to luistiktok and xet7.
and fixes the following bugs:
- [Links to devel branch are broken; use master instead](https://github.com/wekan/wekan/pull/3993).
Thanks to garrison.
- [Fix first user creation for via OIDC](https://github.com/wekan/wekan/pull/3994).
Thanks to ww-daniel-mora.
- [When list has just one card, to show 'card' instead of 'cards'](https://github.com/wekan/wekan/pull/3999).
Thanks to helioguardabaxo.
- [Fix: Linked card cannot change date](https://github.com/wekan/wekan/pull/4002).
Thanks to Ben0it-T.
- [Try to fix: Can't delete attachment](https://github.com/wekan/wekan/commit/889ec1339a025a68ec919f059b9d58e8d94a3376).
Thanks to luistiktok and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.58 2021-09-01 Wekan release
This release fixes the following bugs:
- [1) Edit profile and modify password menus are not displayed if SSO authentication is used.
2) Board filtering will be displayed only if user belongs to atleast one team or
organization](https://github.com/wekan/wekan/pull/3983).
Thanks to Emile840.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.57 2021-08-31 Wekan release
This release adds the following updates:
- [Updated build scripts](https://github.com/wekan/wekan/commit/52fafe997659e933e403acb0ee0cffc99f74e35f).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.56 2021-08-31 Wekan release
This release adds the following updates:
- [Updated dependencies](https://github.com/wekan/wekan/commit/858967f4200783cadaa62d0e3436f661c772ede7).
Thanks to developers of dependencies.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.55 2021-08-31 Wekan release
This release adds to following CRITICAL SECURITY UPDATES:
- [Updated to Node.js v12.22.6](https://github.com/wekan/wekan/commit/48636892489dd01c6f6b930bafb94651c00859d8).
Thanks to Node.js developers.
and fixes the following bugs:
- [Fixed bugs](https://github.com/wekan/wekan/pull/3981):
1) Public Boards page shows only "Add Board" button, not any Public Boards.
2) When at Admin Panel / Boards visibility / Private only, public board still accessible publicly by it's
public board URL.
Thanks to Emile840.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.54 2021-08-28 Wekan release
This release adds the following new features:
- [Admin panel: Added a parameter to display or not the visibility of a board in private mode only](https://github.com/wekan/wekan/pull/3976).
Thanks to Emile840.
and fixes the following bugs:
- [Fix: Incorrect card numbers for sub tasks](https://github.com/wekan/wekan/pull/3977).
Thanks to syndimann.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.53 2021-08-27 Wekan release
This release fixes the following bugs:
- [Try to fix MAIL_FROM](https://github.com/wekan/wekan/commit/787df044190915c46e22159f3c40fb611846dc07).
Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.52 2021-08-26 Wekan release
This release adds the following new features:
- Added MAIL_SERVICE settings for Well Known Email Services
[Part 1](https://github.com/wekan/wekan/commit/ab8e56e16a02ef0afb7b4023a43b4adf2558a8ff),
[Part 2](https://github.com/wekan/wekan/commit/1fadf204c2d5fa96ea41b9cb39f003cc05e2fe46).
https://github.com/wekan/wekan/wiki/Troubleshooting-Mail . Please test.
Thanks to xet7.
- [All Boards page: Possibility of filtering board by team or organization](https://github.com/wekan/wekan/pull/3964).
Thanks to Emile840.
- [Fixed translation of "Clear Filter" for "All boards page: Possibility of filtering board by team or organization"](https://github.com/wekan/wekan/commit/b36a7621e0feca5c22fc4a24eceba1a9fc584ab0).
Thanks to xet7.
and adds the following new translations:
- [Added Chinese (Simplified) (zh-Hans or zh-CN)](https://github.com/wekan/wekan/commit/f2c242f49e18e2197f1f90c9b2dac5934a08325d).
Thanks to translators.
and fixes the following bugs:
- [Initials not required for new user that is created at Admin Panel](https://github.com/wekan/wekan/commit/9c7c481f48cb66406715f7571439f9d7fa332b87).
Thanks to xet7.
- [Delete user is now possible at Admin Panel](https://github.com/wekan/wekan/commit/7808fdd22f04cc482b7df21187aaf3e9623f19e6).
But you should remove user first from all boards, because otherwise there could be
bug of empty avatars at boards, that need to be removed manually from database.
Thanks to xet7.
- [Fixed Save button not clickable in maximized card view](https://github.com/wekan/wekan/commit/a59932af00c066871102970d252b78d262d06fa0).
Thanks to hatl, urmel1960 and syndimann.
- [Fixed New wide card edit view is all jumbled on mobile](https://github.com/wekan/wekan/commit/241eb9df0fb446b3775704848281b0cc032c4921).
Thanks to jdaviescoates and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.51 2021-08-17 Wekan release
This release fixes the following bugs:
- [Fixed exception in global search](https://github.com/wekan/wekan/pull/3949).
Thanks to syndimann.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.50 2021-08-15 Wekan release
This release fixes the following bugs:
- [Fix: Save user initials and fullname when a new user is created](https://github.com/wekan/wekan/pull/3946).
Thanks to syndimann.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.49 2021-08-14 Wekan release
This release adds the following new features:
- [Text "Search" now translatable at Card Add Member/Assignee](https://github.com/wekan/wekan/commit/9ce65c601a875a4259fb69fdda45124b8412ae6f).
Thanks to xet7.
- [Add Card Comment Reactions](https://github.com/wekan/wekan/pull/3945).
Thanks to syndimann.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.48 2021-08-11 Wekan release
This release adds the following CRITICAL SECURITY UPDATES:
- [Updated to Node.js v12.22.5](https://github.com/wekan/wekan/commit/91cad7b49e25cecdf417321dadcdd9ea5cd8b020).
Thanks to Node.js developers.
- Also jszip update in some of included update commits.
and adds the following new features:
- [Searchfields for members and assignees card popups](https://github.com/wekan/wekan/pull/3942).
Thanks to syndimann.
and adds the following updates:
- [Updated dependencies](https://github.com/wekan/wekan/commit/b3cc01b04167bd67dde02c6c899baf8917ae09c1).
Thanks to developers of dependencies.
and adds the following new translations:
- [French (Switzerland) (fr_CH)](https://github.com/wekan/wekan/commit/23c70ac252494b464cd2a268d7e680370775ddc4).
Thanks to translators.
and fixes the following bugs:
- [Fixed: Can't save user without Initials](https://github.com/wekan/wekan/commit/9a03654062f9c8ac7aac257f11b386a054cd39e7).
Thanks to devagleo and xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.47 2021-08-05 Wekan release
This release adds the following updates:
- [Updated dependencies](https://github.com/wekan/wekan/commit/68d9de89466611521db7d942dcf8daf58ba15a3e).
Thanks to developers of dependencies.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.46 2021-08-05 Wekan release
This release adds the following updates:
- [Updated dependencies](https://github.com/wekan/wekan/commit/d5c0a5d377d31bedadf3730756406355a17a563a).
Thanks to developers of dependencies.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.45 2021-08-05 Wekan release
This release adds the following new features:
- [Special handles to notify board or card members in a comment](https://github.com/wekan/wekan/pull/3937).
Thanks to syndimann.
and fixes the following bugs:
- [Fix: Show missing user mentions popover when posting comments in maximized card layout](https://github.com/wekan/wekan/pull/3939).
Thanks to syndimann.
Thanks to above GitHub users for their contributions and translators for their translations.
# v5.44 2021-08-03 Wekan release
@@ -5546,7 +6070,7 @@ This release adds the following new features:
and fixes the following bugs:
- Revert [Sandstorm API changes](https://github.com/wekan/wekan/commit/be03a191c4321c2f80116c0ee1ae6c826d882535)
that were done at [Wekan v2.05](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v205-2019-01-27-wekan-release)
that were done at [Wekan v2.05](https://github.com/wekan/wekan/blob/master/CHANGELOG.md#v205-2019-01-27-wekan-release)
to fix #2143. Thanks to pantraining and xet7.
Thanks to above GitHub users and translators for contributions.
@@ -5693,7 +6217,7 @@ Update translations. Thanks to translators.
This release adds the following new features:
- [IFTTT Rules improvements](https://github.com/wekan/wekan/pull/2088). Thanks to Angtrim.
- Add [find.sh](https://github.com/wekan/wekan/blob/devel/find.sh) bash script that ignores
- Add [find.sh](https://github.com/wekan/wekan/blob/master/find.sh) bash script that ignores
extra directories when searching. xet7 uses this a lot when developing. Thanks to xet7.
Thanks to above GitHub users for their contributions.
@@ -7204,7 +7728,7 @@ This release adds the following new features:
- [Checklist templates](https://github.com/wekan/wekan/pull/1470);
- Added [Finnish language changelog](https://github.com/wekan/wekan/tree/devel/meta/t9n-changelog)
and [more Finnish traslations](https://github.com/wekan/wekan/blob/devel/sandstorm-pkgdef.capnp)
and [more Finnish traslations](https://github.com/wekan/wekan/blob/master/sandstorm-pkgdef.capnp)
to Sandstorm.
Thanks to GitHub users erikturk and xet7 for their contributions.
+5 -4
View File
@@ -1,8 +1,8 @@
FROM quay.io/wekan/ubuntu:groovy-20210115
FROM quay.io/wekan/ubuntu:impish-20211015
LABEL maintainer="wekan"
# 2020-12-03:
# - Above Ubuntu base image copied from Docker Hub ubuntu:groovy-20201125.2
# 2021-09-18:
# - Above Ubuntu base image copied from Docker Hub ubuntu:hirsute-20210825
# to Quay to avoid Docker Hub rate limits.
# Set the environment variables (defaults where required)
@@ -12,7 +12,7 @@ ARG DEBIAN_FRONTEND=noninteractive
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
DEBUG=false \
NODE_VERSION=v12.22.4 \
NODE_VERSION=v12.22.7 \
METEOR_RELEASE=1.10.2 \
USE_EDGE=false \
METEOR_EDGE=1.5-beta.17 \
@@ -309,6 +309,7 @@ RUN \
apt-get remove --purge -y ${BUILD_DEPS} && \
apt-get autoremove -y && \
npm uninstall -g api2html &&\
rm -R /tmp* && \
rm -R /var/lib/apt/lists/* && \
rm -R /home/wekan/.meteor && \
rm -R /home/wekan/app && \
+2 -2
View File
@@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder
ENV QEMU_VERSION=v4.2.0-6 \
QEMU_ARCHITECTURE=aarch64 \
NODE_ARCHITECTURE=linux-arm64 \
NODE_VERSION=v12.22.4 \
NODE_VERSION=v12.22.7 \
WEKAN_VERSION=latest \
WEKAN_ARCHITECTURE=arm64
@@ -40,7 +40,7 @@ LABEL maintainer="wekan"
# Set the environment variables (defaults where required)
ENV QEMU_ARCHITECTURE=aarch64 \
NODE_ARCHITECTURE=linux-arm64 \
NODE_VERSION=v12.22.4 \
NODE_VERSION=v12.22.7 \
NODE_ENV=production \
NPM_VERSION=latest \
WITH_API=true \
+25 -25
View File
@@ -1,6 +1,6 @@
[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-Ready--to--Code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/wekan/wekan)
# Wekan - Open Source kanban
# WeKan ® - Open Source kanban
[![Contributors](https://img.shields.io/github/contributors/wekan/wekan.svg "Contributors")](https://github.com/wekan/wekan/graphs/contributors)
[![Docker Repository on Quay](https://quay.io/repository/wekan/wekan/status "Docker Repository on Quay")](https://quay.io/repository/wekan/wekan)
@@ -14,19 +14,19 @@
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fwekan%2Fwekan.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fwekan%2Fwekan?ref=badge_shield)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4619/badge)](https://bestpractices.coreinfrastructure.org/projects/4619)
## [Translate Wekan at Transifex](https://transifex.com/wekan/wekan)
## [Translate WeKan ® at Transifex](https://transifex.com/wekan/wekan)
Translations to non-English languages are accepted only at [Transifex](https://transifex.com/wekan/wekan) using webbrowser.
New English strings of new features can be added as PRs to edge branch file wekan/i18n/en.i18n.json .
## [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues)
Please add most of your questions as GitHub issue: [Wekan Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
Please add most of your questions as GitHub issue: [WeKan ® Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
It's better than at chat where details get lost when chat scrolls up.
## Chat
[Discussions][discussions] - Wekan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
[Discussions][discussions] - WeKan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
[Wekan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ)
@@ -41,9 +41,9 @@ See https://github.com/wekan/wekan/issues/3874
- Please read the [FAQ](https://github.com/wekan/wekan/wiki/FAQ) first
- Please don't feed the [trolls](https://github.com/wekan/wekan/wiki/FAQ#why-am-i-called-a-troll) and [spammers](https://github.com/wekan/wekan/wiki/FAQ#why-am-i-called-a-spammer) that are mentioned in the FAQ :)
## About Wekan
## About WeKan ®
Wekan is an completely [Open Source][open_source] and [Free software][free_software]
WeKan ® is an completely [Open Source][open_source] and [Free software][free_software]
collaborative kanban board application with MIT license.
Whether you’re maintaining a personal todo list, planning your holidays with some friends,
@@ -51,58 +51,58 @@ or working in a team on your next revolutionary idea, Kanban boards are an unbea
to keep your things organized. They give you a visual overview of the current state of your project,
and make you productive by allowing you to focus on the few items that matter the most.
Since Wekan is a free software, you don’t have to trust us with your data and can
Since WeKan ® is a free software, you don’t have to trust us with your data and can
install Wekan on your own computer or server. In fact we encourage you to do
that by providing one-click installation on various platforms.
- Wekan is used in [most countries of the world](https://snapcraft.io/wekan).
- WeKan ® is used in [most countries of the world](https://snapcraft.io/wekan).
- Wekan largest user has 13k users using Wekan in their company.
- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 63 languages.
- [Features][features]: Wekan has real-time user interface.
- [Platforms][platforms]: Wekan supports many platforms.
Wekan is critical part of new platforms Wekan is currently being integrated to.
- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 70 languages.
- [Features][features]: WeKan ® has real-time user interface.
- [Platforms][platforms]: WeKan ® supports many platforms.
WeKan ® is critical part of new platforms Wekan is currently being integrated to.
## Requirements
- 64bit: Linux [Snap](https://github.com/wekan/wekan-snap/wiki/Install) or [Sandstorm](https://sandstorm.io) /
[Mac](https://github.com/wekan/wekan/wiki/Mac) / [Windows](https://github.com/wekan/wekan/wiki/Install-Wekan-from-source-on-Windows).
[More Platforms](https://github.com/wekan/wekan/wiki/Platforms), bundle for RasPi3 ARM and other CPUs where Node.js and MongoDB exists.
- 1 GB RAM minimum free for Wekan. Production server should have minimum total 4 GB RAM.
- 1 GB RAM minimum free for WeKan ®. Production server should have minimum total 4 GB RAM.
For thousands of users, for example with [Docker](https://github.com/wekan/wekan/blob/master/docker-compose.yml): 3 frontend servers,
each having 2 CPU and 2 wekan-app containers. One backend wekan-db server with many CPUs.
- Enough disk space and alerts about low disk space. If you run out disk space, MongoDB database gets corrupted.
- SECURITY: Updating to newest Wekan version very often. Please check you do not have automatic updates of Sandstorm or Snap turned off.
Old versions have security issues because of old versions Node.js etc. Only newest Wekan is supported.
Wekan on Sandstorm is not usually affected by any Standalone Wekan (Snap/Docker/Source) security issues.
- SECURITY: Updating to newest WeKan ® version very often. Please check you do not have automatic updates of Sandstorm or Snap turned off.
Old versions have security issues because of old versions Node.js etc. Only newest WeKan ® is supported.
WeKan ® on Sandstorm is not usually affected by any Standalone WeKan ® (Snap/Docker/Source) security issues.
- [Reporting all new bugs immediately](https://github.com/wekan/wekan/issues).
New features and fixes are added to Wekan [many times a day](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md).
- [Backups](https://github.com/wekan/wekan/wiki/Backup) of Wekan database once a day miminum.
New features and fixes are added to WeKan ® [many times a day](https://github.com/wekan/wekan/blob/master/CHANGELOG.md).
- [Backups](https://github.com/wekan/wekan/wiki/Backup) of WeKan ® database once a day miminum.
Bugs, updates, users deleting list or card, harddrive full, harddrive crash etc can eat your data. There is no undo yet.
Some bug can cause Wekan board to not load at all, requiring manual fixing of database content.
Some bug can cause WeKan ® board to not load at all, requiring manual fixing of database content.
## Roadmap and Demo
[Roadmap][roadmap_wekan] - Public read-only board at Wekan demo.
[Roadmap][roadmap_wekan] - Public read-only board at WeKan ® demo.
[Developer Documentation][dev_docs]
- There is many companies and individuals contributing code to Wekan, to add features and bugfixes
[many times a day](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md).
- There is many companies and individuals contributing code to WeKan ®, to add features and bugfixes
[many times a day](https://github.com/wekan/wekan/blob/master/CHANGELOG.md).
- [Please add Add new Feature Requests and Bug Reports immediately](https://github.com/wekan/wekan/issues).
- [Commercial Support](https://wekan.team/commercial-support/).
We also welcome sponsors for features and bugfixes.
By working directly with Wekan you get the benefit of active maintenance and new features added by growing Wekan developer community.
By working directly with WeKan ® you get the benefit of active maintenance and new features added by growing WeKan ® developer community.
## Screenshot
[More screenshots at Features page](https://github.com/wekan/wekan/wiki/Features)
[![Screenshot of Wekan][screenshot_wekan]][roadmap_wekan]
[![Screenshot of WeKan ®][screenshot_wekan]][roadmap_wekan]
## License
Wekan is released under the very permissive [MIT license](LICENSE), and made
WeKan ® is released under the very permissive [MIT license](LICENSE), and made
with [Meteor](https://www.meteor.com).
[platforms]: https://github.com/wekan/wekan/wiki/Platforms
+4 -4
View File
@@ -51,8 +51,8 @@ This also means all Standalone Wekan functionality works in offline local networ
Wekan is used by companies that have [thousands of users](https://github.com/wekan/wekan/wiki/AWS) and at healthcare.
Wekan uses xss package for input fields like cards, as you can see from
[package.json](https://github.com/wekan/wekan/blob/devel/package.json). Other used versions can be seen from
[Meteor versions file](https://github.com/wekan/wekan/blob/devel/.meteor/versions).
[package.json](https://github.com/wekan/wekan/blob/master/package.json). Other used versions can be seen from
[Meteor versions file](https://github.com/wekan/wekan/blob/master/.meteor/versions).
Forms can include markdown links, html, image tags etc like you see at https://wekan.github.io .
It's possible to add attachments to cards, and markdown/html links to files.
@@ -69,7 +69,7 @@ access to outside of Wekan grain.
Standalone Wekan only has password auth currently, there is work in progress to add
[oauth2](https://github.com/wekan/wekan/pull/1578), [Openid](https://github.com/wekan/wekan/issues/538),
[LDAP](https://github.com/wekan/wekan/issues/119) etc. If you need more login security for Standalone Wekan now,
it's possible add additional [Google Auth proxybouncer](https://github.com/wekan/wekan/wiki/Let's-Encrypt-and-Google-Auth) in front of password auth, and then use Google Authenticator for Google Auth. Standalone Wekan does have [brute force protection with eluck:accounts-lockout and browser-policy clickjacking protection](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v080-2018-04-04-wekan-release). You can also optionally use some [WAF](https://en.wikipedia.org/wiki/Web_application_firewall)
it's possible add additional [Google Auth proxybouncer](https://github.com/wekan/wekan/wiki/Let's-Encrypt-and-Google-Auth) in front of password auth, and then use Google Authenticator for Google Auth. Standalone Wekan does have [brute force protection with eluck:accounts-lockout and browser-policy clickjacking protection](https://github.com/wekan/wekan/blob/master/CHANGELOG.md#v080-2018-04-04-wekan-release). You can also optionally use some [WAF](https://en.wikipedia.org/wiki/Web_application_firewall)
like for example [AWS WAF](https://aws.amazon.com/waf/).
[All Wekan Platforms](https://github.com/wekan/wekan/wiki/Platforms)
@@ -106,7 +106,7 @@ a security issue, we'd like to know about it, and also how to fix it:
Typical already known or "no impact" bugs such as:
- Brute force password guessign. Currently there is
[brute force protection with eluck:accounts-lockout](https://github.com/wekan/wekan/blob/devel/CHANGELOG.md#v080-2018-04-04-wekan-release).
[brute force protection with eluck:accounts-lockout](https://github.com/wekan/wekan/blob/master/CHANGELOG.md#v080-2018-04-04-wekan-release).
- Security issues related to that Wekan uses Meteor 1.6.0.1 related packages, and upgrading to newer
Meteor 1.6.1 is complicated process that requires lots of changes to many dependency packages.
Upgrading [has been tried many times, spending a lot of time](https://github.com/meteor/meteor/issues/9609)
+1 -1
View File
@@ -1,5 +1,5 @@
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
appVersion: "v5.44.0"
appVersion: "v5.73.0"
files:
userUploads:
- README.md
+95 -18
View File
@@ -5,6 +5,9 @@
# Wekan API Python CLI, originally from here, where is more details:
# https://github.com/wekan/wekan/wiki/New-card-with-Python3-and-REST-API
# TODO:
# addcustomfieldtoboard: There is error: Settings must be object. So adding does not work yet.
try:
# python 3
from urllib.parse import urlencode
@@ -23,12 +26,16 @@ if arguments == 0:
print("AUTHORID is USERID that writes card.")
print("If *nix: chmod +x api.py => ./api.py users")
print("Syntax:")
print(" python3 api.py users # All users")
print(" python3 api.py boards USERID # Boards of USERID")
print(" python3 api.py board BOARDID # Info of BOARDID")
print(" python3 api.py swimlanes BOARDID # Swimlanes of BOARDID")
print(" python3 api.py lists BOARDID # Lists of BOARDID")
print(" python3 api.py list BOARDID LISTID # Info of LISTID")
print(" python3 api.py users # All users")
print(" python3 api.py boards # All Public Boards")
print(" python3 api.py boards USERID # Boards of USERID")
print(" python3 api.py board BOARDID # Info of BOARDID")
print(" python3 api.py customfields BOARDID # Custom Fields of BOARDID")
print(" python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID")
print(" python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board")
print(" python3 api.py swimlanes BOARDID # Swimlanes of BOARDID")
print(" python3 api.py lists BOARDID # Lists of BOARDID")
print(" python3 api.py list BOARDID LISTID # Info of LISTID")
print(" python3 api.py createlist BOARDID LISTTITLE # Create list")
print(" python3 api.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION")
print(" python3 api.py editcard BOARDID LISTID CARDID NEWCARDTITLE NEWCARDDESCRIPTION")
@@ -65,12 +72,15 @@ chmod +x api.py
=== Wekan API Python CLI: Shows IDs for addcard ===
AUTHORID is USERID that writes card.
Syntax:
python3 api.py users # All users
python3 api.py boards USERID # Boards of USERID
python3 api.py board BOARDID # Info of BOARDID
python3 api.py swimlanes BOARDID # Swimlanes of BOARDID
python3 api.py lists BOARDID # Lists of BOARDID
python3 api.py list BOARDID LISTID # Info of LISTID
python3 api.py users # All users
python3 api.py boards USERID # Boards of USERID
python3 api.py board BOARDID # Info of BOARDID
python3 api.py customfields BOARDID # Custom Fields of BOARDID
python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID
python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board
python3 api.py swimlanes BOARDID # Swimlanes of BOARDID
python3 api.py lists BOARDID # Lists of BOARDID
python3 api.py list BOARDID LISTID # Info of LISTID
python3 api.py createlist BOARDID LISTTITLE # Create list
python3 api.py addcard AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION
python3 api.py editcard BOARDID LISTID CARDID NEWCARDTITLE NEWCARDDESCRIPTION
@@ -78,6 +88,13 @@ Syntax:
python3 api.py attachmentjson BOARDID ATTACHMENTID # One attachment as JSON base64
python3 api.py attachmentbinary BOARDID ATTACHMENTID # One attachment as binary file
=== ADD CUSTOM FIELD TO BOARD ===
Type: text, number, date, dropdown, checkbox, currency, stringtemplate.
python3 api.py addcustomfieldtoboard cmx3gmHLKwAXLqjxz LcDW4QdooAx8hsZh8 "SomeField" "date" "" true true true true
=== USERS ===
python3 api.py users
@@ -133,6 +150,7 @@ l = 'lists'
sw = 'swimlane'
sws = 'swimlanes'
cs = 'cards'
cf = 'custom-fields'
bs = 'boards'
atl = 'attachmentslist'
at = 'attachment'
@@ -150,10 +168,34 @@ apikey = d['token']
# ------- LOGIN TOKEN END -----------
if arguments == 10:
if sys.argv[1] == 'addcustomfieldtoboard':
# ------- ADD CUSTOM FIELD TO BOARD START -----------
authorid = sys.argv[2]
boardid = sys.argv[3]
name = sys.argv[4]
type1 = sys.argv[5]
settings = str(json.loads(sys.argv[6]))
# There is error: Settings must be object. So this does not work yet.
#settings = {'currencyCode': 'EUR'}
print(type(settings))
showoncard = sys.argv[7]
automaticallyoncard = sys.argv[8]
showlabelonminicard = sys.argv[9]
showsumattopoflist = sys.argv[10]
customfieldtoboard = wekanurl + apiboards + boardid + s + cf
# Add Custom Field to Board
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
post_data = {'authorId': '{}'.format(authorid), 'name': '{}'.format(name), 'type': '{}'.format(type1), 'settings': '{}'.format(settings), 'showoncard': '{}'.format(showoncard), 'automaticallyoncard': '{}'.format(automaticallyoncard), 'showlabelonminicard': '{}'.format(showlabelonminicard), 'showsumattopoflist': '{}'.format(showsumattopoflist)}
body = requests.post(customfieldtoboard, data=post_data, headers=headers)
print(body.text)
# ------- ADD CUSTOM FIELD TO BOARD END -----------
if arguments == 7:
if sys.argv[1] == 'addcard':
# ------- WRITE TO CARD START -----------
# ------- ADD CARD START -----------
authorid = sys.argv[2]
boardid = sys.argv[3]
swimlaneid = sys.argv[4]
@@ -161,18 +203,18 @@ if arguments == 7:
cardtitle = sys.argv[6]
carddescription = sys.argv[7]
cardtolist = wekanurl + apiboards + boardid + s + l + s + listid + s + cs
# Write to card
# Add card
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
post_data = {'authorId': '{}'.format(authorid), 'title': '{}'.format(cardtitle), 'description': '{}'.format(carddescription), 'swimlaneId': '{}'.format(swimlaneid)}
body = requests.post(cardtolist, data=post_data, headers=headers)
print(body.text)
# ------- WRITE TO CARD END -----------
# ------- ADD CARD END -----------
if arguments == 6:
if sys.argv[1] == 'editcard':
# ------- LIST OF BOARD START -----------
# ------- EDIT CARD START -----------
boardid = sys.argv[2]
listid = sys.argv[3]
cardid = sys.argv[4]
@@ -187,7 +229,7 @@ if arguments == 6:
body = requests.get(edcard, headers=headers)
data2 = body.text.replace('}',"}\n")
print(data2)
# ------- LISTS OF BOARD END -----------
# ------- EDIT CARD END -----------
if arguments == 3:
@@ -217,6 +259,19 @@ if arguments == 3:
print(data2)
# ------- LISTS OF BOARD END -----------
if sys.argv[1] == 'customfield':
# ------- INFO OF CUSTOM FIELD START -----------
boardid = sys.argv[2]
customfieldid = sys.argv[3]
customfieldone = wekanurl + apiboards + boardid + s + cf + s + customfieldid
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
print("=== INFO OF ONE CUSTOM FIELD ===\n")
body = requests.get(customfieldone, headers=headers)
data2 = body.text.replace('}',"}\n")
print(data2)
# ------- INFO OF CUSTOM FIELD END -----------
if arguments == 2:
# ------- BOARDS LIST START -----------
@@ -230,8 +285,8 @@ if arguments == 2:
data2 = body.text.replace('}',"}\n")
print(data2)
# ------- BOARDS LIST END -----------
if sys.argv[1] == 'board':
if sys.argv[1] == 'board':
# ------- BOARD INFO START -----------
boardid = sys.argv[2]
board = wekanurl + apiboards + boardid
@@ -242,6 +297,17 @@ if arguments == 2:
print(data2)
# ------- BOARD INFO END -----------
if sys.argv[1] == 'customfields':
# ------- CUSTOM FIELDS OF BOARD START -----------
boardid = sys.argv[2]
boardcustomfields = wekanurl + apiboards + boardid + s + cf
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
body = requests.get(boardcustomfields, headers=headers)
print("=== CUSTOM FIELDS OF BOARD ===\n")
data2 = body.text.replace('}',"}\n")
print(data2)
# ------- CUSTOM FIELDS OF BOARD END -----------
if sys.argv[1] == 'swimlanes':
boardid = sys.argv[2]
swimlanes = wekanurl + apiboards + boardid + s + sws
@@ -289,3 +355,14 @@ if arguments == 1:
data2 = body.text.replace('}',"}\n")
print(data2)
# ------- LIST OF USERS END -----------
if sys.argv[1] == 'boards':
# ------- LIST OF PUBLIC BOARDS START -----------
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
print("=== PUBLIC BOARDS ===\n")
listpublicboards = wekanurl + apiboards
body = requests.get(listpublicboards, headers=headers)
data2 = body.text.replace('}',"}\n")
print(data2)
# ------- LIST OF PUBLIC BOARDS END -----------
+25 -4
View File
@@ -12,7 +12,7 @@ template(name="boardActivities")
+activity(activity=activityData card=card mode=mode)
template(name="cardActivities")
each activityData in currentCard.activities
each activityData in activities
+activity(activity=activityData card=card mode=mode)
template(name="editOrDeleteComment")
@@ -21,6 +21,26 @@ template(name="editOrDeleteComment")
= ' - '
a.js-delete-comment {{_ "delete"}}
template(name="deleteCommentPopup")
p {{_ "comment-delete"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
template(name="commentReactions")
.reactions
each reaction in reactions
span.reaction(class="{{#if isSelected reaction.userIds}}selected{{/if}}" data-codepoint="#{reaction.reactionCodepoint}" title="{{userNames reaction.userIds}}")
span.reaction-codepoint !{reaction.reactionCodepoint}
span.reaction-count #{reaction.userIds.length}
if (currentUser.isBoardMember)
a.open-comment-reaction-popup(title="{{_ 'addReactionPopup-title'}}")
i.fa.fa-smile-o
i.fa.fa-plus
template(name="addReactionPopup")
.reactions-popup
each codepoint in codepoints
span.add-comment-reaction(data-codepoint="#{codepoint}") !{codepoint}
template(name="activity")
.activity
+userAvatar(userId=activity.user._id)
@@ -124,6 +144,7 @@ template(name="activity")
.activity-comment
+viewer
= activity.comment.text
+commentReactions(reactions=activity.comment.reactions commentId=activity.comment._id)
span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
if($eq currentUser._id activity.comment.userId)
+editOrDeleteComment
@@ -150,20 +171,20 @@ template(name="activity")
if($eq activity.activityType 'a-startAt')
| {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}.
if($eq activity.activityType 'a-dueAt')
| {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}.
if($eq activity.activityType 'a-endAt')
| {{{_ 'activity-endDate' (sanitize endDate) cardLink}}}.
if($eq mode 'board')
if($eq activity.activityType 'a-receivedAt')
| {{{_ 'activity-receivedDate' (sanitize receivedDate) cardLink}}}.
if($eq activity.activityType 'a-startAt')
| {{{_ 'activity-startDate' (sanitize startDate) cardLink}}}.
if($eq activity.activityType 'a-dueAt')
| {{{_ 'activity-dueDate' (sanitize dueDate) cardLink}}}.
+73 -9
View File
@@ -13,14 +13,14 @@ BlazeComponent.extendComponent({
this.autorun(() => {
let mode = this.data().mode;
const capitalizedMode = Utils.capitalize(mode);
let thisId, searchId;
let searchId;
if (mode === 'linkedcard' || mode === 'linkedboard') {
thisId = Session.get('currentCard');
searchId = Cards.findOne({ _id: thisId }).linkedId;
searchId = Utils.getCurrentCard().linkedId;
mode = mode.replace('linked', '');
} else if (mode === 'card') {
searchId = Utils.getCurrentCardId();
} else {
thisId = Session.get(`current${capitalizedMode}`);
searchId = thisId;
searchId = Session.get(`current${capitalizedMode}`);
}
const limit = this.page.get() * activitiesPerPage;
const user = Meteor.user();
@@ -54,6 +54,13 @@ BlazeComponent.extendComponent({
},
}).register('activities');
Template.activities.helpers({
activities() {
const ret = this.card.activities();
return ret;
},
});
BlazeComponent.extendComponent({
checkItem() {
const checkItemId = this.currentData().activity.checklistItemId;
@@ -113,8 +120,10 @@ BlazeComponent.extendComponent({
).getLabelById(lastLabelId);
if (lastLabel && (lastLabel.name === undefined || lastLabel.name === '')) {
return lastLabel.color;
} else {
} else if (lastLabel.name !== undefined && lastLabel.name !== '') {
return lastLabel.name;
} else {
return null;
}
},
@@ -211,10 +220,11 @@ BlazeComponent.extendComponent({
return [
{
// XXX We should use Popup.afterConfirmation here
'click .js-delete-comment'() {
const commentId = this.currentData().activity.commentId;
'click .js-delete-comment': Popup.afterConfirm('deleteComment', () => {
const commentId = this.data().activity.commentId;
CardComments.remove(commentId);
},
Popup.back();
}),
'submit .js-edit-comment'(evt) {
evt.preventDefault();
const commentText = this.currentComponent()
@@ -240,6 +250,60 @@ Template.activity.helpers({
},
});
Template.commentReactions.events({
'click .reaction'(event) {
if (Meteor.user().isBoardMember()) {
const codepoint = event.currentTarget.dataset['codepoint'];
const commentId = Template.instance().data.commentId;
const cardComment = CardComments.findOne({_id: commentId});
cardComment.toggleReaction(codepoint);
}
},
'click .open-comment-reaction-popup': Popup.open('addReaction'),
})
Template.addReactionPopup.events({
'click .add-comment-reaction'(event) {
if (Meteor.user().isBoardMember()) {
const codepoint = event.currentTarget.dataset['codepoint'];
const commentId = Template.instance().data.commentId;
const cardComment = CardComments.findOne({_id: commentId});
cardComment.toggleReaction(codepoint);
}
Popup.back();
},
})
Template.addReactionPopup.helpers({
codepoints() {
// Starting set of unicode codepoints as comment reactions
return [
'&#128077;',
'&#128078;',
'&#128064;',
'&#9989;',
'&#10060;',
'&#128591;',
'&#128079;',
'&#127881;',
'&#128640;',
'&#128522;',
'&#129300;',
'&#128532;'];
}
})
Template.commentReactions.helpers({
isSelected(userIds) {
return userIds.includes(Meteor.user()._id);
},
userNames(userIds) {
return Users.find({_id: {$in: userIds}})
.map(user => user.profile.fullname)
.join(', ');
}
})
function createCardLink(card) {
if (!card) return '';
return (
+54 -1
View File
@@ -5,6 +5,20 @@
display: flex
justify-content:space-between
.reactions-popup
.add-comment-reaction
display: inline-block
cursor: pointer
border-radius: 5px
font-size: 22px
text-align: center
line-height: 30px
width: 40px
&:hover {
background-color: #b0c4de
}
.activities
clear: both
@@ -18,7 +32,7 @@
height: @width
.activity-member
font-weight: 700
font-weight: 700
.activity-desc
word-wrap: break-word
@@ -39,6 +53,45 @@
margin-top: 5px
padding: 5px
.reactions
display: flex
margin-top: 5px
gap: 5px
.open-comment-reaction-popup
display: flex
align-items: center
text-decoration: none
height: 24px;
i.fa.fa-smile-o
font-size: 17px
font-weight: 500
margin-left: 2px
i.fa.fa-plus
font-size: 8px;
margin-top: -7px;
margin-left: 1px;
.reaction
cursor: pointer
border: 1px solid grey
border-radius: 15px
display: flex
padding: 2px 5px
&.selected {
background-color: #b0c4de
}
&:hover {
background-color: #b0c4de
}
.reaction-count
font-size: 12px
.activity-checklist
display: block
border-radius: 3px
+2 -2
View File
@@ -64,7 +64,7 @@ function resetCommentInput(input) {
// Tracker.autorun to register the component dependencies, and re-run when these
// dependencies are invalidated. A better component API would remove this hack.
Tracker.autorun(() => {
Session.get('currentCard');
Utils.getCurrentCardId();
Tracker.afterFlush(() => {
autosize.update($('.js-new-comment-input'));
});
@@ -75,7 +75,7 @@ EscapeActions.register(
() => {
const draftKey = {
fieldName: 'cardComment',
docId: Session.get('currentCard'),
docId: Utils.getCurrentCardId(),
};
const commentInput = $('.js-new-comment-input');
const draft = commentInput.val().trim();
+1 -1
View File
@@ -34,7 +34,7 @@ BlazeComponent.extendComponent({
Utils.goBoardId(board._id);
},
'click .js-delete-board': Popup.afterConfirm('boardDelete', function() {
Popup.close();
Popup.back();
const isSandstorm =
Meteor.settings &&
Meteor.settings.public &&
+23 -20
View File
@@ -13,26 +13,29 @@ template(name="board")
+spinner
template(name="boardBody")
.board-wrapper(class=currentBoard.colorClass)
+sidebar
.board-canvas.js-swimlanes(
class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
class="{{#if draggingActive.get}}is-dragging-active{{/if}}")
if showOverlay.get
.board-overlay
if currentBoard.isTemplatesBoard
each currentBoard.swimlanes
+swimlane(this)
else if isViewSwimlanes
each currentBoard.swimlanes
+swimlane(this)
else if isViewLists
+listsGroup(currentBoard)
else if isViewCalendar
+calendarView
else
+listsGroup(currentBoard)
if notDisplayThisBoard
| {{_ 'tableVisibilityMode-allowPrivateOnly'}}
else
.board-wrapper(class=currentBoard.colorClass)
+sidebar
.board-canvas.js-swimlanes(
class="{{#if Sidebar.isOpen}}is-sibling-sidebar-open{{/if}}"
class="{{#if MultiSelection.isActive}}is-multiselection-active{{/if}}"
class="{{#if draggingActive.get}}is-dragging-active{{/if}}")
if showOverlay.get
.board-overlay
if currentBoard.isTemplatesBoard
each currentBoard.swimlanes
+swimlane(this)
else if isViewSwimlanes
each currentBoard.swimlanes
+swimlane(this)
else if isViewLists
+listsGroup(currentBoard)
else if isViewCalendar
+calendarView
else
+listsGroup(currentBoard)
template(name="calendarView")
if isViewCalendar
+16 -14
View File
@@ -23,7 +23,7 @@ BlazeComponent.extendComponent({
},
onlyShowCurrentCard() {
return Utils.isMiniScreen() && Session.get('currentCard');
return Utils.isMiniScreen() && Utils.getCurrentCardId(true);
},
goHome() {
@@ -33,6 +33,7 @@ BlazeComponent.extendComponent({
BlazeComponent.extendComponent({
onCreated() {
Meteor.subscribe('tableVisibilityModeSettings');
this.showOverlay = new ReactiveVar(false);
this.draggingActive = new ReactiveVar(false);
this._isDragging = false;
@@ -190,21 +191,11 @@ BlazeComponent.extendComponent({
});
this.autorun(() => {
let showDesktopDragHandles = false;
currentUser = Meteor.user();
if (currentUser) {
showDesktopDragHandles = (currentUser.profile || {})
.showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
showDesktopDragHandles = true;
} else {
showDesktopDragHandles = false;
}
if (Utils.isMiniScreen() || showDesktopDragHandles) {
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
$swimlanesDom.sortable({
handle: '.js-swimlane-header-handle',
});
} else if (!Utils.isMiniScreen() && !showDesktopDragHandles) {
} else {
$swimlanesDom.sortable({
handle: '.swimlane-header',
});
@@ -215,7 +206,7 @@ BlazeComponent.extendComponent({
$swimlanesDom.sortable(
'option',
'disabled',
!Meteor.user().isBoardAdmin(),
!Meteor.user() || !Meteor.user().isBoardAdmin(),
);
});
@@ -235,6 +226,16 @@ BlazeComponent.extendComponent({
}
},
notDisplayThisBoard(){
let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly');
let currentBoard = Boards.findOne(Session.get('currentBoard'));
if(allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue && currentBoard.permission == 'public'){
return true;
}
return false;
},
isViewSwimlanes() {
currentUser = Meteor.user();
if (currentUser) {
@@ -325,6 +326,7 @@ BlazeComponent.extendComponent({
defaultView: 'agendaDay',
editable: true,
timezone: 'local',
weekNumbers: true,
header: {
left: 'title today prev,next',
center:
+15 -8
View File
@@ -80,6 +80,12 @@ template(name="boardHeaderBar")
if $eq watchLevel "muted"
i.fa.fa-bell-slash
span {{_ watchLevel}}
a.board-header-btn(title="{{_ 'sort-cards'}}" class="{{#if isSortActive }}emphasis{{else}} js-sort-cards {{/if}}")
i.fa.fa-sort
span {{#if isSortActive }}{{_ 'Sort is on'}}{{else}}{{_ 'sort-cards'}}{{/if}}
if isSortActive
a.board-header-btn-close.js-sort-reset(title="Remove Sort")
i.fa.fa-times-thin
else
a.board-header-btn.js-log-in(
@@ -147,14 +153,15 @@ template(name="boardVisibilityList")
if visibilityCheck
i.fa.fa-check
span.sub-name {{_ 'private-desc'}}
li
with "public"
a.js-select-visibility
i.fa.fa-globe.colorful
| {{_ 'public'}}
if visibilityCheck
i.fa.fa-check
span.sub-name {{_ 'public-desc'}}
if notAllowPrivateVisibilityOnly
li
with "public"
a.js-select-visibility
i.fa.fa-globe.colorful
| {{_ 'public'}}
if visibilityCheck
i.fa.fa-check
span.sub-name {{_ 'public-desc'}}
template(name="boardChangeVisibilityPopup")
+boardVisibilityList
+23 -15
View File
@@ -7,11 +7,11 @@ Template.boardMenuPopup.events({
'click .js-rename-board': Popup.open('boardChangeTitle'),
'click .js-custom-fields'() {
Sidebar.setView('customFields');
Popup.close();
Popup.back();
},
'click .js-open-archives'() {
Sidebar.setView('archives');
Popup.close();
Popup.back();
},
'click .js-change-board-color': Popup.open('boardChangeColor'),
'click .js-change-language': Popup.open('changeLanguage'),
@@ -24,7 +24,7 @@ Template.boardMenuPopup.events({
}),
'click .js-delete-board': Popup.afterConfirm('deleteBoard', function() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
Popup.close();
Popup.back();
Boards.remove(currentBoard._id);
FlowRouter.go('home');
}),
@@ -47,7 +47,7 @@ Template.boardChangeTitlePopup.events({
if (newTitle) {
this.rename(newTitle);
this.setDescription(newDesc);
Popup.close();
Popup.back();
}
event.preventDefault();
},
@@ -136,7 +136,7 @@ BlazeComponent.extendComponent({
Sidebar.setView('search');
},
'click .js-multiselection-activate'() {
const currentCard = Session.get('currentCard');
const currentCard = Utils.getCurrentCardId();
MultiSelection.activate();
if (currentCard) {
MultiSelection.add(currentCard);
@@ -173,15 +173,15 @@ Template.boardHeaderBar.helpers({
Template.boardChangeViewPopup.events({
'click .js-open-lists-view'() {
Utils.setBoardView('board-view-lists');
Popup.close();
Popup.back();
},
'click .js-open-swimlanes-view'() {
Utils.setBoardView('board-view-swimlanes');
Popup.close();
Popup.back();
},
'click .js-open-cal-view'() {
Utils.setBoardView('board-view-cal');
Popup.close();
Popup.back();
},
});
@@ -194,6 +194,11 @@ const CreateBoard = BlazeComponent.extendComponent({
this.visibilityMenuIsOpen = new ReactiveVar(false);
this.visibility = new ReactiveVar('private');
this.boardId = new ReactiveVar('');
Meteor.subscribe('tableVisibilityModeSettings');
},
notAllowPrivateVisibilityOnly(){
return !TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').booleanValue;
},
visibilityCheck() {
@@ -310,6 +315,9 @@ const CreateBoard = BlazeComponent.extendComponent({
}.register('headerBarCreateBoardPopup'));
BlazeComponent.extendComponent({
notAllowPrivateVisibilityOnly(){
return !TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').booleanValue;
},
visibilityCheck() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return this.currentData() === currentBoard.permission;
@@ -319,7 +327,7 @@ BlazeComponent.extendComponent({
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const visibility = this.currentData();
currentBoard.setVisibility(visibility);
Popup.close();
Popup.back();
},
events() {
@@ -352,7 +360,7 @@ BlazeComponent.extendComponent({
Session.get('currentBoard'),
level,
(err, ret) => {
if (!err && ret) Popup.close();
if (!err && ret) Popup.back();
},
);
},
@@ -424,7 +432,7 @@ BlazeComponent.extendComponent({
const direction = down ? -1 : 1;
this.setSortBy([sortby, direction]);
if (Utils.isMiniScreen) {
Popup.close();
Popup.back();
}
},
},
@@ -443,7 +451,7 @@ BlazeComponent.extendComponent({
};
Session.set('sortBy', sortBy);
sortCardsBy.set(TAPi18n.__('due-date'));
Popup.close();
Popup.back();
},
'click .js-sort-title'() {
const sortBy = {
@@ -451,7 +459,7 @@ BlazeComponent.extendComponent({
};
Session.set('sortBy', sortBy);
sortCardsBy.set(TAPi18n.__('title'));
Popup.close();
Popup.back();
},
'click .js-sort-created-asc'() {
const sortBy = {
@@ -459,7 +467,7 @@ BlazeComponent.extendComponent({
};
Session.set('sortBy', sortBy);
sortCardsBy.set(TAPi18n.__('date-created-newest-first'));
Popup.close();
Popup.back();
},
'click .js-sort-created-desc'() {
const sortBy = {
@@ -467,7 +475,7 @@ BlazeComponent.extendComponent({
};
Session.set('sortBy', sortBy);
sortCardsBy.set(TAPi18n.__('date-created-oldest-first'));
Popup.close();
Popup.back();
},
},
];
+22 -1
View File
@@ -1,11 +1,32 @@
template(name="boardList")
.wrapper
ul.AllBoardTeamsOrgs
li.AllBoardTeams
if userHasTeams
select.js-AllBoardTeams#jsAllBoardTeams("multiple")
option(value="-1") {{_ 'teams'}} :
each teamsDatas
option(value="{{teamId}}") {{_ teamDisplayName}}
li.AllBoardOrgs
if userHasOrgs
select.js-AllBoardOrgs#jsAllBoardOrgs("multiple")
option(value="-1") {{_ 'organizations'}} :
each orgsDatas
option(value="{{orgId}}") {{_ orgDisplayName}}
li.AllBoardBtns
div.AllBoardButtonsContainer
if userHasOrgsOrTeams
i.fa.fa-filter
input#filterBtn(type="button" value="{{_ 'filter'}}")
input#resetBtn(type="button" value="{{_ 'filter-clear'}}")
ul.board-list.clearfix.js-boards
li.js-add-board
a.board-list-item.label(title="{{_ 'add-board'}}")
| {{_ 'add-board'}}
each boards
li(class="{{#if isStarred}}starred{{/if}}" class=colorClass).js-board
li(class="{{_id}}" class="{{#if isStarred}}starred{{/if}}" class=colorClass).js-board
if isInvited
.board-list-item
span.details
+125 -5
View File
@@ -22,6 +22,7 @@ Template.boardListHeaderBar.helpers({
BlazeComponent.extendComponent({
onCreated() {
Meteor.subscribe('setting');
Meteor.subscribe('tableVisibilityModeSettings');
let currUser = Meteor.user();
let userLanguage;
if(currUser && currUser.profile){
@@ -84,9 +85,47 @@ BlazeComponent.extendComponent({
}
});
},
userHasTeams(){
if(Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0)
return true;
else
return false;
},
teamsDatas() {
if(Meteor.user().teams)
return Meteor.user().teams;
else
return [];
},
userHasOrgs(){
if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
return true;
else
return false;
},
orgsDatas() {
if(Meteor.user().orgs)
return Meteor.user().orgs;
else
return [];
},
userHasOrgsOrTeams(){
let boolUserHasOrgs;
if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
boolUserHasOrgs = true;
else
boolUserHasOrgs = false;
let boolUserHasTeams;
if(Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0)
boolUserHasTeams = true;
else
boolUserHasTeams = false;
return (boolUserHasOrgs || boolUserHasTeams);
},
boards() {
const query = {
let query = {
//archived: false,
////type: { $in: ['board','template-container'] },
//type: 'board',
@@ -96,9 +135,15 @@ BlazeComponent.extendComponent({
{ $or:[] }
]
};
let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly');
if (FlowRouter.getRouteName() === 'home'){
query.$and[2].$or.push({'members.userId': Meteor.userId()});
if(allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue){
query.$and.push({'permission': 'private'});
}
const currUser = Users.findOne(Meteor.userId());
// const currUser = Users.findOne(Meteor.userId(), {
@@ -108,7 +153,7 @@ BlazeComponent.extendComponent({
// },
// });
let orgIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
let orgIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
if(orgIdsUserBelongs && orgIdsUserBelongs != ''){
let orgsIds = orgIdsUserBelongs.split(',');
// for(let i = 0; i < orgsIds.length; i++){
@@ -119,7 +164,7 @@ BlazeComponent.extendComponent({
query.$and[2].$or.push({'orgs.orgId': {$in : orgsIds}});
}
let teamIdsUserBelongs = currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
let teamIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
if(teamIdsUserBelongs && teamIdsUserBelongs != ''){
let teamsIds = teamIdsUserBelongs.split(',');
// for(let i = 0; i < teamsIds.length; i++){
@@ -129,10 +174,17 @@ BlazeComponent.extendComponent({
query.$and[2].$or.push({'teams.teamId': {$in : teamsIds}});
}
}
else query.permission = 'public';
else if(allowPrivateVisibilityOnly !== undefined && !allowPrivateVisibilityOnly.booleanValue){
query = {
archived: false,
//type: { $in: ['board','template-container'] },
type: 'board',
permission: 'public',
};
}
return Boards.find(query, {
//sort: { sort: 1 /* boards default sorting */ },
sort: { sort: 1 /* boards default sorting */ },
});
},
isStarred() {
@@ -206,6 +258,74 @@ BlazeComponent.extendComponent({
}
});
},
'click #resetBtn'(event){
let allBoards = document.getElementsByClassName("js-board");
let currBoard;
for(let i=0; i < allBoards.length; i++){
currBoard = allBoards[i];
currBoard.style.display = "block";
}
},
'click #filterBtn'(event) {
event.preventDefault();
let selectedTeams = document.querySelectorAll('#jsAllBoardTeams option:checked');
let selectedTeamsValues = Array.from(selectedTeams).map(function(elt){return elt.value});
let index = selectedTeamsValues.indexOf("-1");
if (index > -1) {
selectedTeamsValues.splice(index, 1);
}
let selectedOrgs = document.querySelectorAll('#jsAllBoardOrgs option:checked');
let selectedOrgsValues = Array.from(selectedOrgs).map(function(elt){return elt.value});
index = selectedOrgsValues.indexOf("-1");
if (index > -1) {
selectedOrgsValues.splice(index, 1);
}
if(selectedTeamsValues.length > 0 || selectedOrgsValues.length > 0){
const query = {
$and: [
{ archived: false },
{ type: 'board' },
{ $or:[] }
]
};
if(selectedTeamsValues.length > 0)
{
query.$and[2].$or.push({'teams.teamId': {$in : selectedTeamsValues}});
}
if(selectedOrgsValues.length > 0)
{
query.$and[2].$or.push({'orgs.orgId': {$in : selectedOrgsValues}});
}
let filteredBoards = Boards.find(query, {}).fetch();
let allBoards = document.getElementsByClassName("js-board");
let currBoard;
if(filteredBoards.length > 0){
let currBoardId;
let found;
for(let i=0; i < allBoards.length; i++){
currBoard = allBoards[i];
currBoardId = currBoard.classList[0];
found = filteredBoards.find(function(board){
return board._id == currBoardId;
});
if(found !== undefined)
currBoard.style.display = "block";
else
currBoard.style.display = "none";
}
}
else{
for(let i=0; i < allBoards.length; i++){
currBoard = allBoards[i];
currBoard.style.display = "none";
}
}
}
},
},
];
},
+22
View File
@@ -229,3 +229,25 @@ $spaceBetweenTiles = 16px
transform: translateY(-50%)
right: 10px
font-size: 24px
.AllBoardTeamsOrgs
list-style-type: none;
overflow: hidden;
.AllBoardTeams,.AllBoardOrgs,.AllBoardBtns
float: left;
.js-AllBoardOrgs
margin-left: 16px;
.AllBoardTeams
margin-left : 16px;
.AllBoardButtonsContainer
margin: 16px;
#filterBtn,#resetBtn
display: inline;
.js-board
display: block;
+12
View File
@@ -26,6 +26,18 @@ template(name="attachmentsGalery")
if isUploaded
if isImage
img.attachment-thumbnail-img(src="{{url}}")
else if($eq extension 'mp3')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="audio/mpeg")
else if($eq extension 'ogg')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="video/ogg")
else if($eq extension 'webm')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="video/webm")
else if($eq extension 'mp4')
video(width="100%" height="100%" controls="true")
source(src="{{url}}" type="video/mp4")
else
span.attachment-thumbnail-ext= extension
else
+4 -4
View File
@@ -4,7 +4,7 @@ Template.attachmentsGalery.events({
'attachmentDelete',
function() {
Attachments.remove(this._id);
Popup.close();
Popup.back();
},
),
// If we let this event bubble, FlowRouter will handle it and empty the page
@@ -53,7 +53,7 @@ Template.attachmentsGalery.helpers({
Template.previewAttachedImagePopup.events({
'click .js-large-image-clicked'() {
Popup.close();
Popup.back();
},
});
@@ -65,7 +65,7 @@ Template.cardAttachmentsPopup.events({
if (attachment && attachment._id && attachment.isImage()) {
card.setCover(attachment._id);
}
Popup.close();
Popup.back();
});
};
@@ -174,7 +174,7 @@ Template.previewClipboardImagePopup.events({
pastedResults = null;
$(document.body).pasteImageReader(() => {});
Popup.close();
Popup.back();
}
},
});
+1 -1
View File
@@ -9,7 +9,7 @@
margin: 10px 1% 0
text-align: center
border-radius: 3px
overflow: hidden
overflow: auto
background: darken(white, 7%)
min-height: 120px
+15 -11
View File
@@ -79,18 +79,22 @@ template(name="cardCustomField-currency")
template(name="cardCustomField-date")
if canModifyCard
a.js-edit-date(title="{{showTitle}}" class="{{classes}}")
if value
div.card-date
time(datetime="{{showISODate}}")
| {{showDate}}
else
| {{_ 'edit'}}
else
a.js-edit-date(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}")
if value
div.card-date
time(datetime="{{showISODate}}")
| {{showDate}}
div.card-date
time(datetime="{{showISODate}}")
| {{showDate}}
b
| {{showWeek}}
else
| {{_ 'edit'}}
else
if value
div.card-date
time(datetime="{{showISODate}}")
| {{showDate}}
b
| {{showWeek}}
template(name="cardCustomField-dropdown")
if canModifyCard
+8 -4
View File
@@ -3,7 +3,7 @@ import Cards from '/models/cards';
Template.cardCustomFieldsPopup.helpers({
hasCustomField() {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const customFieldId = this._id;
return card.customFieldIndex(customFieldId) > -1;
},
@@ -11,7 +11,7 @@ Template.cardCustomFieldsPopup.helpers({
Template.cardCustomFieldsPopup.events({
'click .js-select-field'(event) {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const customFieldId = this._id;
card.toggleCustomField(customFieldId);
event.preventDefault();
@@ -31,7 +31,7 @@ const CardCustomField = BlazeComponent.extendComponent({
onCreated() {
const self = this;
self.card = Cards.findOne(Session.get('currentCard'));
self.card = Utils.getCurrentCard();
self.customFieldId = this.data()._id;
},
@@ -149,6 +149,10 @@ CardCustomField.register('cardCustomField');
});
}
showWeek() {
return this.date.get().week().toString();
}
showDate() {
// this will start working once mquandalle:moment
// is updated to at least moment.js 2.10.5
@@ -190,7 +194,7 @@ CardCustomField.register('cardCustomField');
onCreated() {
super.onCreated();
const self = this;
self.card = Cards.findOne(Session.get('currentCard'));
self.card = Utils.getCurrentCard();
self.customFieldId = this.data()._id;
this.data().value && this.date.set(moment(this.data().value));
}
+9 -3
View File
@@ -1,14 +1,20 @@
template(name="dateBadge")
if canModifyCard
a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}")
a.js-edit-date.card-date(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
b
| {{showWeek}}
else
a.card-date(title="{{showTitle}}" class="{{classes}}")
a.card-date(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
b
| {{showWeek}}
template(name="dateCustomField")
a(title="{{showTitle}}" class="{{classes}}")
a(title="{{showTitle}} {{_ 'predicate-week'}} {{showWeek}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
b
| {{showWeek}}
+24 -7
View File
@@ -24,7 +24,7 @@ Template.dateBadge.helpers({
}
_deleteDate() {
this.card.setReceived(null);
this.card.unsetReceived();
}
}.register('editCardReceivedDatePopup'));
@@ -50,7 +50,7 @@ Template.dateBadge.helpers({
}
_deleteDate() {
this.card.setStart(null);
this.card.unsetStart();
}
}.register('editCardStartDatePopup'));
@@ -73,7 +73,7 @@ Template.dateBadge.helpers({
}
_deleteDate() {
this.card.setDue(null);
this.card.unsetDue();
}
}.register('editCardDueDatePopup'));
@@ -96,7 +96,7 @@ Template.dateBadge.helpers({
}
_deleteDate() {
this.card.setEnd(null);
this.card.unsetEnd();
}
}.register('editCardEndDatePopup'));
@@ -115,6 +115,10 @@ const CardDate = BlazeComponent.extendComponent({
}, 60000);
},
showWeek() {
return this.date.get().week().toString();
},
showDate() {
// this will start working once mquandalle:moment
// is updated to at least moment.js 2.10.5
@@ -284,12 +288,25 @@ class CardCustomFieldDate extends CardDate {
});
}
classes() {
return 'customfield-date';
showWeek() {
return this.date.get().week().toString();
}
showDate() {
// this will start working once mquandalle:moment
// is updated to at least moment.js 2.10.5
// until then, the date is displayed in the "L" format
return this.date.get().calendar(null, {
sameElse: 'llll',
});
}
showTitle() {
return '';
return `${this.date.get().format('LLLL')}`;
}
classes() {
return 'customfield-date';
}
events() {
+4 -1
View File
@@ -25,7 +25,10 @@ BlazeComponent.extendComponent({
// Pressing Ctrl+Enter should submit the form
'keydown form textarea'(evt) {
if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) {
this.find('button[type=submit]').click();
const submitButton = this.find('button[type=submit]');
if (submitButton) {
submitButton.click();
}
}
},
},
+63 -26
View File
@@ -1,27 +1,38 @@
template(name="cardDetailsPopup")
+cardDetails(popupCard)
template(name="cardDetails")
section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}'): .card-details-canvas
section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas
.card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
+inlinedForm(classNames="js-card-details-title")
+editCardTitleForm
else
unless isMiniScreen
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
unless cardMaximized
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
if cardMaximized
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
unless isPopup
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
if cardMaximized
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
else
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
if currentUser.isBoardMember
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
input.inline-input(type="text" id="cardURL_copy" value="{{ originRelativeUrl }}")
a.fa.fa-link.card-copy-button.js-copy-link(
id="cardURL_copy"
class="fa-link"
title="{{_ 'copy-card-link-to-clipboard'}}"
href="{{ originRelativeUrl }}"
)
if isMiniScreen
a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details(title="{{_ 'close-card'}}")
else
unless isPopup
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
if currentUser.isBoardMember
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
a.fa.fa-link.card-copy-mobile-button
a.fa.fa-link.card-copy-mobile-button.js-copy-link(
id="cardURL_copy"
class="fa-link"
title="{{_ 'copy-card-link-to-clipboard'}}"
href="{{ originRelativeUrl }}"
)
h2.card-details-title.js-card-title(
class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
+viewer
@@ -66,8 +77,10 @@ template(name="cardDetails")
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus
if currentBoard.allowsReceivedDate
if currentBoard.hasAnyAllowsDate
hr
if currentBoard.allowsReceivedDate
.card-details-item.card-details-item-received
h3.card-details-item-title
i.fa.fa-sign-out
@@ -119,7 +132,9 @@ template(name="cardDetails")
a.card-label.add-label.js-end-date
i.fa.fa-plus
hr
if currentBoard.hasAnyAllowsUser
hr
if currentBoard.allowsCreator
.card-details-item.card-details-item-creator
h3.card-details-item-title
@@ -160,17 +175,6 @@ template(name="cardDetails")
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
i.fa.fa-plus
//.card-details-items
if getSpentTime
.card-details-item.card-details-item-spent
if getIsOvertime
h3.card-details-item-title
| {{_ 'overtime-hours'}}
else
h3.card-details-item-title
| {{_ 'spent-time-hours'}}
+cardSpentTime
//.card-details-items
if currentBoard.allowsRequestedBy
.card-details-item.card-details-item-name
@@ -212,6 +216,9 @@ template(name="cardDetails")
+viewer
= getAssignedBy
if $or currentBoard.allowsCardSortingByNumber getSpentTime
hr
if currentBoard.allowsCardSortingByNumber
.card-details-item.card-details-sort-order
h3.card-details-item-title
@@ -225,15 +232,36 @@ template(name="cardDetails")
+viewer
= sort
//.card-details-items
if getSpentTime
.card-details-item.card-details-item-spent
if getIsOvertime
h3.card-details-item-title
| {{_ 'overtime-hours'}}
else
h3.card-details-item-title
| {{_ 'spent-time-hours'}}
+cardSpentTime
//.card-details-items
if customFieldsWD
hr
unless customFieldsGrid
hr
each customFieldsWD
if customFieldsGrid
hr
.card-details-item.card-details-item-customfield
h3.card-details-item-title
i.fa.fa-list-alt
= definition.name
+cardCustomField
.material-toggle-switch(title="{{_ 'change'}} {{_ 'custom-fields'}} {{_ 'layout'}}")
if customFieldsGrid
input.toggle-switch(type="checkbox" id="toggleCustomFieldsGridButton" checked="checked")
else
input.toggle-switch(type="checkbox" id="toggleCustomFieldsGridButton")
label.toggle-label(for="toggleCustomFieldsGridButton")
a.fa.fa-plus.js-custom-fields.card-details-item.custom-fields(title="{{_ 'custom-fields'}}")
if getVoteQuestion
hr
@@ -519,6 +547,7 @@ template(name="cardDetails")
.card-details-right
unless currentUser.isNoComments
hr
.activity-title
h3.card-details-item-title
i.fa.fa-history
@@ -708,8 +737,9 @@ template(name="boardsAndLists")
button.primary.confirm.js-done {{_ 'done'}}
template(name="cardMembersPopup")
input.card-members-filter(type="text" placeholder="{{_ 'search'}}")
ul.pop-over-list.js-card-member-list
each board.activeMembers
each members
li.item(class="{{#if isCardMember}}active{{/if}}")
a.name.js-select-member(href="#")
+userAvatar(userId=user._id)
@@ -720,9 +750,10 @@ template(name="cardMembersPopup")
i.fa.fa-check
template(name="cardAssigneesPopup")
input.card-assignees-filter(type="text" placeholder="{{_ 'search'}}")
unless currentUser.isWorker
ul.pop-over-list.js-card-assignee-list
each board.activeMembers
each members
li.item(class="{{#if isCardAssignee}}active{{/if}}")
a.name.js-select-assignee(href="#")
+userAvatar(userId=user._id)
@@ -815,6 +846,12 @@ template(name="cardDeletePopup")
p {{_ "card-delete-suggest-archive"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
template(name="cardArchivePopup")
p {{_ "card-archive-pop"}}
unless archived
p {{_ "card-archive-suggest-cancel"}}
button.js-confirm.negate.full(type="submit") {{_ 'archive'}}
template(name="deleteVotePopup")
p {{_ "vote-delete-pop"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
+199 -94
View File
@@ -34,15 +34,25 @@ BlazeComponent.extendComponent({
onCreated() {
this.currentBoard = Boards.findOne(Session.get('currentBoard'));
this.isLoaded = new ReactiveVar(false);
const boardBody = this.parentComponent().parentComponent();
//in Miniview parent is Board, not BoardBody.
if (boardBody !== null) {
boardBody.showOverlay.set(true);
boardBody.mouseHasEnterCardDetails = false;
if (this.parentComponent() && this.parentComponent().parentComponent()) {
const boardBody = this.parentComponent().parentComponent();
//in Miniview parent is Board, not BoardBody.
if (boardBody !== null) {
boardBody.showOverlay.set(true);
boardBody.mouseHasEnterCardDetails = false;
}
}
this.calculateNextPeak();
Meteor.subscribe('unsaved-edits');
// this.findUsersOptions = new ReactiveVar({});
// this.page = new ReactiveVar(1);
// this.autorun(() => {
// const limitUsers = this.page.get() * Number.MAX_SAFE_INTEGER;
// this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {});
// });
},
isWatching() {
@@ -54,6 +64,11 @@ BlazeComponent.extendComponent({
return Meteor.user().hasHiddenSystemMessages();
},
customFieldsGrid() {
return Meteor.user().hasCustomFieldsGrid();
},
cardMaximized() {
return Meteor.user().hasCardMaximized();
},
@@ -180,7 +195,7 @@ BlazeComponent.extendComponent({
integration,
'CardSelected',
params,
() => {},
() => { },
);
});
}
@@ -203,7 +218,7 @@ BlazeComponent.extendComponent({
distance: 7,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
EscapeActions.executeUpTo('popup-close');
EscapeActions.clickExecute(evt.target, 'inlinedForm');
},
stop(evt, ui) {
let prevChecklist = ui.item.prev('.js-checklist').get(0);
@@ -285,6 +300,7 @@ BlazeComponent.extendComponent({
},
onDestroyed() {
if (this.parentComponent() === null) return;
const parentComponent = this.parentComponent().parentComponent();
//on mobile view parent is Board, not board body.
if (parentComponent === null) return;
@@ -307,7 +323,8 @@ BlazeComponent.extendComponent({
'click .js-close-card-details'() {
Utils.goBoardId(this.data().boardId);
},
'click .js-copy-link'() {
'click .js-copy-link'(event) {
event.preventDefault();
const StringToCopyElement = document.getElementById('cardURL_copy');
StringToCopyElement.value =
window.location.origin + window.location.pathname;
@@ -365,6 +382,12 @@ BlazeComponent.extendComponent({
this.data().setRequestedBy('');
}
},
'keydown input.js-edit-card-sort'(evt) {
// enter = save
if (evt.keyCode === 13) {
this.find('button[type=submit]').click();
}
},
'submit .js-card-details-sort'(event) {
event.preventDefault();
const sort = parseFloat(this.currentComponent()
@@ -389,7 +412,9 @@ BlazeComponent.extendComponent({
'click .js-end-date': Popup.open('editCardEndDate'),
'click .js-show-positive-votes': Popup.open('positiveVoteMembers'),
'click .js-show-negative-votes': Popup.open('negativeVoteMembers'),
'click .js-custom-fields': Popup.open('cardCustomFields'),
'mouseenter .js-card-details'() {
if (this.parentComponent() === null) return;
const parentComponent = this.parentComponent().parentComponent();
//on mobile view parent is Board, not BoardBody.
if (parentComponent === null) return;
@@ -412,6 +437,9 @@ BlazeComponent.extendComponent({
'click #toggleButton'() {
Meteor.call('toggleSystemMessages');
},
'click #toggleCustomFieldsGridButton'() {
Meteor.call('toggleCustomFieldsGrid');
},
'click .js-maximize-card-details'() {
Meteor.call('toggleCardMaximized');
autosize($('.card-details'));
@@ -511,6 +539,22 @@ BlazeComponent.extendComponent({
},
}).register('cardDetails');
Template.cardDetails.helpers({
isPopup() {
let ret = !!Utils.getPopupCardId();
return ret;
}
});
Template.cardDetailsPopup.onDestroyed(() => {
Session.delete('popupCard');
});
Template.cardDetailsPopup.helpers({
popupCard() {
const ret = Utils.getPopupCard();
return ret;
},
});
BlazeComponent.extendComponent({
template() {
return 'exportCard';
@@ -541,8 +585,8 @@ BlazeComponent.extendComponent({
}).register('exportCardPopup');
// only allow number input
Template.editCardSortOrderForm.onRendered(function() {
this.$('input').on("keypress paste", function(event) {
Template.editCardSortOrderForm.onRendered(function () {
this.$('input').on("keypress paste", function (event) {
let keyCode = event.keyCode;
let charCode = String.fromCharCode(keyCode);
let regex = new RegExp('[-0-9.]');
@@ -561,16 +605,15 @@ Template.editCardSortOrderForm.onRendered(function() {
// XXX Recovering the currentCard identifier form a session variable is
// fragile because this variable may change for instance if the route
// change. We should use some component props instead.
docId: Session.get('currentCard'),
docId: Utils.getCurrentCardId(),
};
}
close(isReset = false) {
if (this.isOpen.get() && !isReset) {
const draft = this.getValue().trim();
if (
draft !== Cards.findOne(Session.get('currentCard')).getDescription()
) {
let card = Utils.getCurrentCard();
if (card && draft !== card.getDescription()) {
UnsavedEdits.set(this._getUnsavedEditKey(), this.getValue());
}
}
@@ -615,7 +658,6 @@ Template.cardDetailsActionsPopup.events({
'click .js-export-card': Popup.open('exportCard'),
'click .js-members': Popup.open('cardMembers'),
'click .js-assignees': Popup.open('cardAssignees'),
'click .js-labels': Popup.open('cardLabels'),
'click .js-attachments': Popup.open('cardAttachments'),
'click .js-start-voting': Popup.open('cardStartVoting'),
'click .js-start-planning-poker': Popup.open('cardStartPlanningPoker'),
@@ -638,6 +680,7 @@ Template.cardDetailsActionsPopup.events({
.map((c) => c.sort),
);
this.move(this.boardId, this.swimlaneId, this.listId, minOrder - 1);
Popup.back();
},
'click .js-move-card-to-bottom'(event) {
event.preventDefault();
@@ -648,11 +691,11 @@ Template.cardDetailsActionsPopup.events({
);
this.move(this.boardId, this.swimlaneId, this.listId, maxOrder + 1);
},
'click .js-archive'(event) {
event.preventDefault();
this.archive();
'click .js-archive': Popup.afterConfirm('cardArchive', function () {
Popup.close();
},
this.archive();
Utils.goBoardId(this.boardId);
}),
'click .js-more': Popup.open('cardMore'),
'click .js-toggle-watch-card'() {
const currentCard = this;
@@ -667,6 +710,64 @@ Template.editCardTitleForm.onRendered(function () {
autosize(this.$('.js-edit-card-title'));
});
Template.cardMembersPopup.onCreated(function () {
let currBoard = Boards.findOne(Session.get('currentBoard'));
let members = currBoard.activeMembers();
// let query = {
// "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) },
// };
// let boardTeamUsers = Users.find(query, {
// sort: { sort: 1 },
// });
// members = currBoard.activeMembers2(members, boardTeamUsers);
this.members = new ReactiveVar(members);
});
Template.cardMembersPopup.events({
'keyup .card-members-filter'(event) {
const members = filterMembers(event.target.value);
Template.instance().members.set(members);
}
});
Template.cardMembersPopup.helpers({
members() {
return Template.instance().members.get();
},
});
const filterMembers = (filterTerm) => {
let currBoard = Boards.findOne(Session.get('currentBoard'));
let members = currBoard.activeMembers();
// let query = {
// "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) },
// };
// let boardTeamUsers = Users.find(query, {
// sort: { sort: 1 },
// });
// members = currBoard.activeMembers2(members, boardTeamUsers);
if (filterTerm) {
members = members
.map(member => ({
member,
user: Users.findOne(member.userId)
}))
.filter(({ user }) =>
(user.profile.fullname !== undefined && user.profile.fullname.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
|| user.profile.fullname === undefined && user.profile.username !== undefined && user.profile.username.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
.map(({ member }) => member);
}
return members;
}
Template.editCardTitleForm.events({
'keydown .js-edit-card-title'(event) {
// If enter key was pressed, submit the data
@@ -707,7 +808,7 @@ Template.moveCardPopup.events({
'click .js-done'() {
// XXX We should *not* get the currentCard from the global state, but
// instead from a “component” state.
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const bSelect = $('.js-select-boards')[0];
let boardId;
// if we are a worker, we won't have a board select so we just use the
@@ -719,7 +820,13 @@ Template.moveCardPopup.events({
const slSelect = $('.js-select-swimlanes')[0];
const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
card.move(boardId, swimlaneId, listId, 0);
Popup.close();
// set new id's to card object in case the card is moved to top by the comment "moveCard" after this command (.js-move-card)
this.boardId = boardId;
this.swimlaneId = swimlaneId;
this.listId = listId;
Popup.back();
},
});
BlazeComponent.extendComponent({
@@ -765,7 +872,7 @@ BlazeComponent.extendComponent({
Template.copyCardPopup.events({
'click .js-done'() {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const lSelect = $('.js-select-lists')[0];
const listId = lSelect.options[lSelect.selectedIndex].value;
const slSelect = $('.js-select-swimlanes')[0];
@@ -787,14 +894,14 @@ Template.copyCardPopup.events({
// See https://github.com/wekan/wekan/issues/80
Filter.addException(_id);
Popup.close();
Popup.back();
}
},
});
Template.convertChecklistItemToCardPopup.events({
'click .js-done'() {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const lSelect = $('.js-select-lists')[0];
const listId = lSelect.options[lSelect.selectedIndex].value;
const slSelect = $('.js-select-swimlanes')[0];
@@ -814,7 +921,7 @@ Template.convertChecklistItemToCardPopup.events({
});
Filter.addException(_id);
Popup.close();
Popup.back();
}
},
@@ -822,7 +929,7 @@ Template.convertChecklistItemToCardPopup.events({
Template.copyChecklistToManyCardsPopup.events({
'click .js-done'() {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const oldId = card._id;
card._id = null;
const lSelect = $('.js-select-lists')[0];
@@ -870,7 +977,7 @@ Template.copyChecklistToManyCardsPopup.events({
cmt.copy(_id);
});
}
Popup.close();
Popup.back();
}
},
});
@@ -904,7 +1011,7 @@ BlazeComponent.extendComponent({
},
'click .js-remove-color'() {
this.currentCard.setColor(null);
Popup.close();
Popup.back();
},
},
];
@@ -941,7 +1048,7 @@ BlazeComponent.extendComponent({
},
cards() {
const currentId = Session.get('currentCard');
const currentId = Utils.getCurrentCardId();
if (this.parentBoard.get()) {
return Cards.find({
boardId: this.parentBoard.get(),
@@ -1006,7 +1113,7 @@ BlazeComponent.extendComponent({
}
},
'click .js-delete': Popup.afterConfirm('cardDelete', function () {
Popup.close();
Popup.back();
// verify that there are no linked cards
if (Cards.find({ linkedId: this._id }).count() === 0) {
Cards.remove(this._id);
@@ -1019,9 +1126,8 @@ BlazeComponent.extendComponent({
// https://github.com/wekan/wekan/issues/2785
const message = `${TAPi18n.__(
'delete-linked-card-before-this-card',
)} linkedId: ${
this._id
} at client/components/cards/cardDetails.js and https://github.com/wekan/wekan/issues/2785`;
)} linkedId: ${this._id
} at client/components/cards/cardDetails.js and https://github.com/wekan/wekan/issues/2785`;
alert(message);
}
Utils.goBoardId(this.boardId);
@@ -1074,12 +1180,12 @@ BlazeComponent.extendComponent({
if (endString) {
this.currentCard.setVoteEnd(endString);
}
Popup.close();
Popup.back();
},
'click .js-remove-vote': Popup.afterConfirm('deleteVote', () => {
event.preventDefault();
this.currentCard.unsetVote();
Popup.close();
Popup.back();
}),
'click a.js-toggle-vote-public'(event) {
event.preventDefault();
@@ -1119,7 +1225,7 @@ BlazeComponent.extendComponent({
// if active vote - store it
if (this.currentData().getVoteQuestion()) {
this._storeDate(newDate.toDate());
Popup.close();
Popup.back();
} else {
this.currentData().vote = { end: newDate.toDate() }; // set vote end temp
Popup.back();
@@ -1153,86 +1259,77 @@ BlazeComponent.extendComponent({
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(usaDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: usaDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (euroAmDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(euroAmDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: euroAmDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (euro24hDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(euro24hDate.toDate());
this.card.setPokerEnd(euro24hDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: euro24hDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (eurodotDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(eurodotDate.toDate());
this.card.setPokerEnd(eurodotDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: eurodotDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (minusDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(minusDate.toDate());
this.card.setPokerEnd(minusDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: minusDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (slashDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(slashDate.toDate());
this.card.setPokerEnd(slashDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: slashDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (dotDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(dotDate.toDate());
this.card.setPokerEnd(dotDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: dotDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (brezhonegDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(brezhonegDate.toDate());
this.card.setPokerEnd(brezhonegDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: brezhonegDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (hrvatskiDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(hrvatskiDate.toDate());
this.card.setPokerEnd(hrvatskiDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: hrvatskiDate.toDate() }; // set poker end temp
Popup.back();
@@ -1242,41 +1339,37 @@ BlazeComponent.extendComponent({
if (this.currentData().getPokerQuestion()) {
this._storeDate(latviaDate.toDate());
this.card.setPokerEnd(latviaDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: latviaDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (nederlandsDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(nederlandsDate.toDate());
this.card.setPokerEnd(nederlandsDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: nederlandsDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (greekDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(greekDate.toDate());
this.card.setPokerEnd(greekDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: greekDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (macedonianDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(macedonianDate.toDate());
this.card.setPokerEnd(macedonianDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: macedonianDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else {
this.error.set('invalid-date');
evt.target.date.focus();
@@ -1285,7 +1378,7 @@ BlazeComponent.extendComponent({
'click .js-delete-date'(evt) {
evt.preventDefault();
this._deleteDate();
Popup.close();
Popup.back();
},
},
];
@@ -1323,11 +1416,11 @@ BlazeComponent.extendComponent({
if (endString) {
this.currentCard.setPokerEnd(endString);
}
Popup.close();
Popup.back();
},
'click .js-remove-poker': Popup.afterConfirm('deletePoker', (event) => {
this.currentCard.unsetPoker();
Popup.close();
Popup.back();
}),
'click a.js-toggle-poker-allow-non-members'(event) {
event.preventDefault();
@@ -1390,7 +1483,7 @@ BlazeComponent.extendComponent({
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(newDate.toDate());
Popup.close();
Popup.back();
} else {
this.currentData().poker = { end: newDate.toDate() }; // set poker end temp
Popup.back();
@@ -1422,130 +1515,117 @@ BlazeComponent.extendComponent({
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(usaDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: usaDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (euroAmDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(euroAmDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: euroAmDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (euro24hDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(euro24hDate.toDate());
this.card.setPokerEnd(euro24hDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: euro24hDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (eurodotDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(eurodotDate.toDate());
this.card.setPokerEnd(eurodotDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: eurodotDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (minusDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(minusDate.toDate());
this.card.setPokerEnd(minusDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: minusDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (slashDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(slashDate.toDate());
this.card.setPokerEnd(slashDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: slashDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (dotDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(dotDate.toDate());
this.card.setPokerEnd(dotDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: dotDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (brezhonegDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(brezhonegDate.toDate());
this.card.setPokerEnd(brezhonegDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: brezhonegDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (hrvatskiDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(hrvatskiDate.toDate());
this.card.setPokerEnd(hrvatskiDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: hrvatskiDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (latviaDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(latviaDate.toDate());
this.card.setPokerEnd(latviaDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: latviaDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (nederlandsDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(nederlandsDate.toDate());
this.card.setPokerEnd(nederlandsDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: nederlandsDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (greekDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(greekDate.toDate());
this.card.setPokerEnd(greekDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: greekDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else if (macedonianDate.isValid()) {
// if active poker - store it
if (this.currentData().getPokerQuestion()) {
this._storeDate(macedonianDate.toDate());
this.card.setPokerEnd(macedonianDate.toDate());
Popup.close();
} else {
this.currentData().poker = { end: macedonianDate.toDate() }; // set poker end temp
Popup.back();
}
Popup.back();
} else {
// this.error.set('invalid-date);
this.error.set('invalid-date' + ' ' + dateString);
@@ -1555,7 +1635,7 @@ BlazeComponent.extendComponent({
'click .js-delete-date'(evt) {
evt.preventDefault();
this._deleteDate();
Popup.close();
Popup.back();
},
},
];
@@ -1589,13 +1669,34 @@ EscapeActions.register(
},
);
Template.cardAssigneesPopup.onCreated(function () {
let currBoard = Boards.findOne(Session.get('currentBoard'));
let members = currBoard.activeMembers();
// let query = {
// "teams.teamId": { $in: currBoard.teams.map(t => t.teamId) },
// };
// let boardTeamUsers = Users.find(query, {
// sort: { sort: 1 },
// });
// members = currBoard.activeMembers2(members, boardTeamUsers);
this.members = new ReactiveVar(members);
});
Template.cardAssigneesPopup.events({
'click .js-select-assignee'(event) {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const assigneeId = this.userId;
card.toggleAssignee(assigneeId);
event.preventDefault();
},
'keyup .card-assignees-filter'(event) {
const members = filterMembers(event.target.value);
Template.instance().members.set(members);
},
});
Template.cardAssigneesPopup.helpers({
@@ -1606,6 +1707,10 @@ Template.cardAssigneesPopup.helpers({
return _.contains(cardAssignees, this.userId);
},
members() {
return Template.instance().members.get();
},
user() {
return Users.findOne(this.userId);
},
@@ -1657,7 +1762,7 @@ Template.cardAssigneePopup.helpers({
Template.cardAssigneePopup.events({
'click .js-remove-assignee'() {
Cards.findOne(this.cardId).unassignAssignee(this.userId);
Popup.close();
Popup.back();
},
'click .js-edit-profile': Popup.open('editProfile'),
});
+50 -45
View File
@@ -4,15 +4,6 @@
avatar-radius = 50%
#cardURL_copy
// Have clipboard text not visible by moving it to far left
position: absolute
left: -2000px
top: 0px
#clipboard
white-space: normal
.assignee
border-radius: 3px
display: block
@@ -230,55 +221,54 @@ avatar-radius = 50%
word-wrap: break-word
max-width: 28%
flex-grow: 1
&.custom-fields
padding-left: 10px
.card-details-item-title
font-size: 16px
font-weight: bold
color: #4d4d4d
.card-label
padding-top: 5px
padding-bottom: 5px
.activities
padding-top: 10px
.card-details-maximized
padding: 0
flex-shrink: 0
flex-basis: calc(100% - 20px)
will-change: flex-basis
overflow-y: scroll
overflow-x: scroll
background: darken(white, 3%)
border-radius: bottom 3px
z-index: 1000 !important
animation: flexGrowIn 0.1s
box-shadow: 0 0 7px 0 darken(white, 30%)
transition: flex-basis 0.1s
box-sizing: border-box
position: absolute
top: 0
left: 0
height: calc(100% - 20px)
width: calc(100% - 20px)
float: left
.card-details-left
@media screen and (min-width: 801px)
.card-details-maximized
padding: 0
flex-shrink: 0
flex-basis: calc(100% - 20px)
will-change: flex-basis
overflow-y: scroll
overflow-x: scroll
background: darken(white, 3%)
border-radius: bottom 3px
z-index: 1000 !important
animation: flexGrowIn 0.1s
box-shadow: 0 0 7px 0 darken(white, 30%)
transition: flex-basis 0.1s
box-sizing: border-box
position: absolute
top: 0
left: 0
height: calc(100% - 20px)
width: calc(100% - 20px)
float: left
top: 60px
left: 20px
width: 47%
.card-details-right
position: absolute
float: right
top: 20px
left: 50%
.card-details-left
float: left
top: 60px
left: 20px
width: 47%
.card-details-header
width: 47%
.card-details-right
position: absolute
float: right
top: 20px
left: 50%
.card-details-header
width: 47%
input[type="text"].attachment-add-link-input
float: left
@@ -315,6 +305,21 @@ input[type="submit"].attachment-add-link-submit
.minimize-card-details
margin-right: 40px
.card-details-popup
padding: 0px 10px
.pop-over > .content-wrapper > .popup-container-depth-0
width: 100%
& > .content
width: calc(100% - 10px)
& > .content > .card-details-popup
overflow-y: auto
& hr
margin: 15px 0px
card-details-color(background, color...)
background: background !important
if color
+8 -5
View File
@@ -9,7 +9,6 @@ BlazeComponent.extendComponent({
toggleOvertime() {
this.card.setIsOvertime(!this.card.getIsOvertime());
$('#overtime .materialCheckBox').toggleClass('is-checked');
$('#overtime').toggleClass('is-checked');
},
storeTime(spentTime, isOvertime) {
@@ -18,6 +17,7 @@ BlazeComponent.extendComponent({
},
deleteTime() {
this.card.setSpentTime(null);
this.card.setIsOvertime(false);
},
events() {
return [
@@ -27,11 +27,14 @@ BlazeComponent.extendComponent({
evt.preventDefault();
const spentTime = parseFloat(evt.target.time.value);
const isOvertime = this.card.getIsOvertime();
//const isOvertime = this.card.getIsOvertime();
let isOvertime = false;
if ($('#overtime').attr('class').indexOf('is-checked') >= 0) {
isOvertime = true;
}
if (spentTime >= 0) {
this.storeTime(spentTime, isOvertime);
Popup.close();
Popup.back();
} else {
this.error.set('invalid-time');
evt.target.time.focus();
@@ -40,7 +43,7 @@ BlazeComponent.extendComponent({
'click .js-delete-time'(evt) {
evt.preventDefault();
this.deleteTime();
Popup.close();
Popup.back();
},
'click a.js-toggle-overtime': this.toggleOvertime,
},
+2 -2
View File
@@ -18,14 +18,14 @@ template(name="checklists")
.card-checklist-items
each checklist in currentCard.checklists
each checklist in checklists
+checklistDetail(checklist = checklist)
if canModifyCard
+inlinedForm(autoclose=false classNames="js-add-checklist" cardId = cardId)
+addChecklistItemForm
else
a.js-open-inlined-form(title="{{_ 'add-checklist'}}")
a.add-checklist.js-open-inlined-form(title="{{_ 'add-checklist'}}")
i.fa.fa-plus
template(name="checklistDetail")
+13 -4
View File
@@ -16,7 +16,7 @@ function initSorting(items) {
scroll: false,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
EscapeActions.executeUpTo('popup-close');
EscapeActions.clickExecute(evt.target, 'inlinedForm');
},
stop(evt, ui) {
const parent = ui.item.parents('.js-checklist-items');
@@ -94,16 +94,14 @@ BlazeComponent.extendComponent({
title,
sort: card.checklists().count(),
});
this.closeAllInlinedForms();
setTimeout(() => {
this.$('.add-checklist-item')
.last()
.click();
}, 100);
}
textarea.value = '';
textarea.focus();
},
addChecklistItem(event) {
event.preventDefault();
const textarea = this.find('textarea.js-add-checklist-item');
@@ -190,6 +188,10 @@ BlazeComponent.extendComponent({
}
},
closeAllInlinedForms() {
this.$('.js-close-inlined-form').click();
},
events() {
const events = {
'click .toggle-delete-checklist-dialog'(event) {
@@ -214,6 +216,8 @@ BlazeComponent.extendComponent({
'click .js-delete-checklist-item': this.deleteItem,
'click .confirm-checklist-delete': this.deleteChecklist,
'focus .js-add-checklist-item': this.focusChecklistItem,
'click .add-checklist-item.js-open-inlined-form': this.closeAllInlinedForms,
'click .add-checklist.js-open-inlined-form': this.closeAllInlinedForms,
keydown: this.pressKey,
},
];
@@ -262,6 +266,11 @@ BlazeComponent.extendComponent({
}).register('boardsSwimlanesAndLists');
Template.checklists.helpers({
checklists() {
const card = Cards.findOne(this.cardId);
const ret = card.checklists();
return ret;
},
hideCheckedItems() {
const currentUser = Meteor.user();
if (currentUser) return currentUser.hasHideCheckedItems();
+4 -2
View File
@@ -27,9 +27,11 @@ template(name="deleteLabelPopup")
template(name="cardLabelsPopup")
ul.edit-labels-pop-over
each board.labels
li
li.js-card-label-item
a.card-label-edit-button.fa.fa-pencil.js-edit-label
span.card-label.card-label-selectable.js-select-label(class="card-label-{{color}}"
if isMiniScreenOrShowDesktopDragHandles
span.fa.label-handle(class="fa-arrows" title="{{_ 'dragLabel'}}")
span.card-label.card-label-selectable.js-select-label.card-label-wrapper(class="card-label-{{color}}"
class="{{# if isLabelSelected ../_id }}active{{/if}}")
+viewer
= name
+51 -8
View File
@@ -39,15 +39,58 @@ Template.createLabelPopup.helpers({
},
});
Template.cardLabelsPopup.events({
'click .js-select-label'(event) {
const card = Cards.findOne(Session.get('currentCard'));
const labelId = this._id;
card.toggleLabel(labelId);
event.preventDefault();
BlazeComponent.extendComponent({
onRendered() {
const itemsSelector = 'li.js-card-label-item:not(.placeholder)';
const $labels = this.$('.edit-labels-pop-over');
$labels.sortable({
connectWith: '.edit-labels-pop-over',
tolerance: 'pointer',
appendTo: '.edit-labels-pop-over',
helper: 'clone',
distance: 7,
items: itemsSelector,
placeholder: 'card-label-wrapper placeholder',
start(evt, ui) {
ui.helper.css('z-index', 1000);
ui.placeholder.height(ui.helper.height());
EscapeActions.clickExecute(evt.target, 'inlinedForm');
},
stop(evt, ui) {
const newLabelOrderOnlyIds = ui.item.parent().children().toArray().map(_element => Blaze.getData(_element)._id)
const card = Blaze.getData(this);
card.board().setNewLabelOrder(newLabelOrderOnlyIds);
},
});
Utils.enableClickOnTouch(itemsSelector);
// Disable drag-dropping if the current user is not a board member or is comment only
this.autorun(() => {
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
$labels.sortable({
handle: '.label-handle',
});
}
});
},
'click .js-edit-label': Popup.open('editLabel'),
'click .js-add-label': Popup.open('createLabel'),
events() {
return [
{
'click .js-select-label'(event) {
const card = Utils.getCurrentCard();
const labelId = this.currentData()._id;
card.toggleLabel(labelId);
event.preventDefault();
},
'click .js-edit-label': Popup.open('editLabel'),
'click .js-add-label': Popup.open('createLabel'),
}
];
}
}).register('cardLabelsPopup');
Template.cardLabelsPopup.events({
});
Template.formLabel.events({
+14 -6
View File
@@ -2,6 +2,7 @@
// XXX Use .board-widget-labels as a flexbox container
.card-label
border: 1px solid #000000
border-radius: 4px
color: white //Default white text, in select cases, changed to black to improve contrast between label colour and text
display: inline-block
@@ -12,10 +13,11 @@
padding: 3px 8px
max-width: 210px
min-width: 8px
overflow: ellipsis
word-wrap: break-word
height: 18px
vertical-align: bottom
min-height: 18px
vertical-align: middle
white-space: initial
overflow: initial
&:hover
color: white
@@ -27,12 +29,13 @@
&.add-label
box-shadow: 0 0 0 2px darken(white, 25%) inset
border: initial
&:hover, &.is-active
box-shadow: 0 0 0 2px darken(white, 60%) inset
i.fa-plus
margin-top: 3px
p
margin: 0px
.palette-colors
display: flex
@@ -47,7 +50,6 @@
.card-label-white
background-color: #ffffff
color: #000000 //Black text for better visibility
border: 1px solid #c0c0c0
.card-label-white:hover
color: #aaaaaa //grey text for better visibility
@@ -220,3 +222,9 @@
&:hover
background: #dbdbdb
ul.edit-labels-pop-over
span.fa.label-handle
padding-right: 10px;
span.fa.label-handle + .card-label
max-width: 180px
+10 -9
View File
@@ -2,21 +2,17 @@ template(name="minicard")
.minicard(
class="{{#if isLinkedCard}}linked-card{{/if}}"
class="{{#if isLinkedBoard}}linked-board{{/if}}"
class="minicard-{{colorClass}}")
if isMiniScreen
class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}")
if isMiniScreenOrShowDesktopDragHandles
.handle
.fa.fa-arrows
unless isMiniScreen
if showDesktopDragHandles
.handle
.fa.fa-arrows
if cover
.minicard-cover(style="background-image: url('{{cover.url}}');")
if labels
.minicard-labels
.minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}")
each labels
unless hiddenMinicardLabelText
span.card-label(class="card-label-{{color}}" title=name)
span.js-card-label.card-label(class="card-label-{{color}}" title=name)
+viewer
= name
if hiddenMinicardLabelText
@@ -145,4 +141,9 @@ template(name="minicard")
if currentBoard.allowsCardSortingByNumber
.badge
span.badge-icon.fa.fa-sort
span.badge-text {{ sort }}
span.badge-text.check-list-sort {{ sort }}
template(name="editCardSortOrderPopup")
input.js-edit-card-sort-popup(type='text' autofocus value=sort dir="auto")
.edit-controls.clearfix
button.primary.confirm.js-submit-edit-card-sort-popup(type="submit") {{_ 'save'}}
+40 -13
View File
@@ -49,6 +49,16 @@ BlazeComponent.extendComponent({
return false;
},
/** opens the card label popup only if clicked onto a label
* <li> this is necessary to have the data context of the minicard.
* if .js-card-label is used at click event, then only the data context of the label itself is available at this.currentData()
*/
cardLabelsPopup(event) {
if (this.find('.js-card-label:hover')) {
Popup.open("cardLabels")(event, {dataContextIfCurrentDataIsUndefined: this.currentData()});
}
},
events() {
return [
{
@@ -57,8 +67,6 @@ BlazeComponent.extendComponent({
else if (this.data().isLinkedBoard())
Utils.goBoardId(this.data().linkedId);
},
},
{
'click .js-toggle-minicard-label-text'() {
if (window.localStorage.getItem('hiddenMinicardLabelText')) {
window.localStorage.removeItem('hiddenMinicardLabelText'); //true
@@ -66,22 +74,14 @@ BlazeComponent.extendComponent({
window.localStorage.setItem('hiddenMinicardLabelText', 'true'); //true
}
},
},
'click span.badge-icon.fa.fa-sort, click span.badge-text.check-list-sort' : Popup.open("editCardSortOrder"),
'click .minicard-labels' : this.cardLabelsPopup,
}
];
},
}).register('minicard');
Template.minicard.helpers({
showDesktopDragHandles() {
currentUser = Meteor.user();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
}
},
hiddenMinicardLabelText() {
currentUser = Meteor.user();
if (currentUser) {
@@ -93,3 +93,30 @@ Template.minicard.helpers({
}
},
});
BlazeComponent.extendComponent({
events() {
return [
{
'keydown input.js-edit-card-sort-popup'(evt) {
// enter = save
if (evt.keyCode === 13) {
this.find('button[type=submit]').click();
}
},
'click button.js-submit-edit-card-sort-popup'(event) {
// save button pressed
event.preventDefault();
const sort = this.$('.js-edit-card-sort-popup')[0]
.value
.trim();
if (!Number.isNaN(sort)) {
let card = this.data();
card.move(card.boardId, card.swimlaneId, card.listId, sort);
Popup.back();
}
},
}
]
}
}).register('editCardSortOrderPopup');
+4 -2
View File
@@ -80,8 +80,6 @@
.minicard-labels
float: none
display: flex
flex-wrap: wrap
.minicard-label
width: 11px
@@ -90,6 +88,10 @@
margin-right: 3px
margin-bottom: 3px
.minicard-labels-no-text
display: flex
flex-wrap: wrap
.minicard-custom-fields
display:block;
.minicard-custom-field
+1 -1
View File
@@ -1,6 +1,6 @@
template(name="resultCard")
.result-card-wrapper
a.minicard-wrapper.card-title(href=originRelativeUrl)
a.minicard-wrapper.js-minicard.card-title(href=originRelativeUrl)
+minicard(this)
//= card.title
ul.result-card-context-list
+17 -1
View File
@@ -5,7 +5,23 @@ Template.resultCard.helpers({
});
BlazeComponent.extendComponent({
clickOnMiniCard(evt) {
evt.preventDefault();
Session.set('popupCard', this.currentData()._id);
this.cardDetailsPopup(evt);
},
cardDetailsPopup(event) {
if (!Popup.isOpen()) {
Popup.open("cardDetails")(event);
}
},
events() {
return [{}];
return [
{
'click .js-minicard': this.clickOnMiniCard,
},
];
},
}).register('resultCard');
+3
View File
@@ -37,6 +37,8 @@ BlazeComponent.extendComponent({
? targetBoard.getDefaultSwimline()._id
: targetSwimlane._id;
const nextCardNumber = targetBoard.getNextCardNumber();
if (title) {
const _id = Cards.insert({
title,
@@ -49,6 +51,7 @@ BlazeComponent.extendComponent({
sort: sortIndex,
swimlaneId,
type: 'cardType-card',
cardNumber: nextCardNumber
});
// In case the filter is active we need to add the newly inserted card in
+1
View File
@@ -247,6 +247,7 @@ textarea
position: absolute
left: -9999px
visibility: hidden
display: none
.materialCheckBox
position: relative
+2 -26
View File
@@ -117,22 +117,11 @@ BlazeComponent.extendComponent({
});
this.autorun(() => {
let showDesktopDragHandles = false;
currentUser = Meteor.user();
if (currentUser) {
showDesktopDragHandles = (currentUser.profile || {})
.showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
showDesktopDragHandles = true;
} else {
showDesktopDragHandles = false;
}
if (Utils.isMiniScreen() || showDesktopDragHandles) {
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
$cards.sortable({
handle: '.handle',
});
} else if (!Utils.isMiniScreen() && !showDesktopDragHandles) {
} else {
$cards.sortable({
handle: '.minicard',
});
@@ -178,19 +167,6 @@ BlazeComponent.extendComponent({
},
}).register('list');
Template.list.helpers({
showDesktopDragHandles() {
currentUser = Meteor.user();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
}
},
});
Template.miniList.events({
'click .js-select-list'() {
const listId = this._id;
+12
View File
@@ -4,6 +4,17 @@ template(name="listBody")
if cards.count
+inlinedForm(autoclose=false position="top")
+addCardForm(listId=_id position="top")
ul.sidebar-list
each customFieldsSum
li
+viewer
= name
if $eq customFieldsSum.type "number"
+viewer
= value
if $eq customFieldsSum.type "currency"
+viewer
= formattedCurrencyCustomFieldValue(value)
each (cardsWithLimit (idOrNull ../../_id))
a.minicard-wrapper.js-minicard(href=originRelativeUrl
class="{{#if cardIsSelected}}is-selected{{/if}}"
@@ -42,6 +53,7 @@ template(name="addCardForm")
.add-controls.clearfix
button.primary.confirm(type="submit") {{_ 'add'}}
a.fa.fa-times-thin.js-close-inlined-form
unless currentBoard.isTemplatesBoard
unless currentBoard.isTemplateBoard
span.quiet
+26 -14
View File
@@ -13,6 +13,13 @@ BlazeComponent.extendComponent({
return [];
},
customFieldsSum() {
return CustomFields.find({
boardIds: { $in: [Session.get('currentBoard')] },
showSumAtTopOfList: true,
});
},
openForm(options) {
options = options || {};
options.position = options.position || 'top';
@@ -141,6 +148,10 @@ BlazeComponent.extendComponent({
// If the card is already selected, we want to de-select it.
// XXX We should probably modify the minicard href attribute instead of
// overwriting the event in case the card is already selected.
} else if (Utils.isMiniScreen()) {
evt.preventDefault();
Session.set('popupCard', this.currentData()._id);
this.cardDetailsPopup(evt);
} else if (Session.equals('currentCard', this.currentData()._id)) {
evt.stopImmediatePropagation();
evt.preventDefault();
@@ -209,6 +220,12 @@ BlazeComponent.extendComponent({
);
},
cardDetailsPopup(event) {
if (!Popup.isOpen()) {
Popup.open("cardDetails")(event);
}
},
events() {
return [
{
@@ -479,7 +496,7 @@ BlazeComponent.extendComponent({
evt.preventDefault();
const linkedId = $('.js-select-cards option:selected').val();
if (!linkedId) {
Popup.close();
Popup.back();
return;
}
const _id = Cards.insert({
@@ -494,7 +511,7 @@ BlazeComponent.extendComponent({
linkedId,
});
Filter.addException(_id);
Popup.close();
Popup.back();
},
'click .js-link-board'(evt) {
//LINK BOARD
@@ -505,7 +522,7 @@ BlazeComponent.extendComponent({
!impBoardId ||
Cards.findOne({ linkedId: impBoardId, archived: false })
) {
Popup.close();
Popup.back();
return;
}
const _id = Cards.insert({
@@ -520,7 +537,7 @@ BlazeComponent.extendComponent({
linkedId: impBoardId,
});
Filter.addException(_id);
Popup.close();
Popup.back();
},
},
];
@@ -567,7 +584,7 @@ BlazeComponent.extendComponent({
});
}
if (!board) {
Popup.close();
Popup.back();
return;
}
const boardId = board._id;
@@ -694,7 +711,7 @@ BlazeComponent.extendComponent({
},
);
}
Popup.close();
Popup.back();
},
},
];
@@ -782,17 +799,12 @@ BlazeComponent.extendComponent({
return false;
}
const spinnerViewPosition = this.spinner.offsetTop - this.container.offsetTop + this.spinner.clientHeight;
const parentViewHeight = this.container.clientHeight;
const bottomViewPosition = this.container.scrollTop + parentViewHeight;
let spinnerOffsetTop = this.spinner.offsetTop;
const addCard = $(this.container).find("a.open-minicard-composer").first()[0];
if (addCard !== undefined) {
spinnerOffsetTop -= addCard.clientHeight;
}
return bottomViewPosition > spinnerOffsetTop;
return bottomViewPosition > spinnerViewPosition;
}
getSkSpinnerName() {
+2 -2
View File
@@ -20,7 +20,7 @@ template(name="listHeader")
if showCardsCountForList cards.count
|&nbsp;
span(class="cardCount") {{cardsCount}} {{_ 'cards-count'}}
span(class="cardCount") {{cardsCount}} {{cardsCountForListIsOne cards.count}}
if isMiniScreen
if currentList
if isWatching
@@ -44,7 +44,7 @@ template(name="listHeader")
a.js-add-card.fa.fa-plus.list-header-plus-icon(title="{{_ 'add-card-to-top-of-list'}}")
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
if currentUser.isBoardAdmin
if showDesktopDragHandles
if isShowDesktopDragHandles
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
template(name="editListTitleForm")
+15 -18
View File
@@ -85,6 +85,14 @@ BlazeComponent.extendComponent({
return limit >= 0 && count >= limit;
},
cardsCountForListIsOne(count) {
if (count === 1) {
return TAPi18n.__('cards-count-one');
} else {
return TAPi18n.__('cards-count');
}
},
events() {
return [
{
@@ -114,18 +122,7 @@ BlazeComponent.extendComponent({
Template.listHeader.helpers({
isBoardAdmin() {
return Meteor.user().isBoardAdmin();
},
showDesktopDragHandles() {
currentUser = Meteor.user();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
}
},
}
});
Template.listActionPopup.helpers({
@@ -148,19 +145,19 @@ Template.listActionPopup.events({
'click .js-select-cards'() {
const cardIds = this.allCards().map(card => card._id);
MultiSelection.add(cardIds);
Popup.close();
Popup.back();
},
'click .js-toggle-watch-list'() {
const currentList = this;
const level = currentList.findWatcher(Meteor.userId()) ? null : 'watching';
Meteor.call('watch', 'list', currentList._id, level, (err, ret) => {
if (!err && ret) Popup.close();
if (!err && ret) Popup.back();
});
},
'click .js-close-list'(event) {
event.preventDefault();
this.archive();
Popup.close();
Popup.back();
},
'click .js-set-wip-limit': Popup.open('setWipLimit'),
'click .js-more': Popup.open('listMore'),
@@ -236,7 +233,7 @@ BlazeComponent.extendComponent({
Template.listMorePopup.events({
'click .js-delete': Popup.afterConfirm('listDelete', function() {
Popup.close();
Popup.back();
// TODO how can we avoid the fetch call?
const allCards = this.allCards().fetch();
const allCardIds = _.pluck(allCards, '_id');
@@ -302,11 +299,11 @@ BlazeComponent.extendComponent({
},
'click .js-submit'() {
this.currentList.setColor(this.currentColor.get());
Popup.close();
Popup.back();
},
'click .js-remove-color'() {
this.currentList.setColor(null);
Popup.close();
Popup.back();
},
},
];
+2 -2
View File
@@ -38,12 +38,12 @@ BlazeComponent.extendComponent({
{
'click .js-due-cards-view-me'() {
Utils.setDueCardsView('me');
Popup.close();
Popup.back();
},
'click .js-due-cards-view-all'() {
Utils.setDueCardsView('all');
Popup.close();
Popup.back();
},
},
];
+15 -6
View File
@@ -1,3 +1,9 @@
const specialHandles = [
{userId: 'board_members', username: 'board_members'},
{userId: 'card_members', username: 'card_members'}
];
const specialHandleNames = specialHandles.map(m => m.username);
Template.editor.onRendered(() => {
const textareaSelector = 'textarea';
const mentions = [
@@ -7,13 +13,16 @@ Template.editor.onRendered(() => {
search(term, callback) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
callback(
_.union(
currentBoard
.activeMembers()
.map(member => {
const username = Users.findOne(member.userId).username;
return username.includes(term) ? username : null;
const user = Users.findOne(member.userId);
const username = user.username;
const fullName = user.profile && user.profile !== undefined ? user.profile.fullname : "";
return username.includes(term) || fullName.includes(term) ? fullName + "(" + username + ")" : null;
})
.filter(Boolean),
.filter(Boolean), [...specialHandleNames])
);
},
template(value) {
@@ -141,7 +150,7 @@ Template.editor.onRendered(() => {
const $summernote = getSummernote(this);
if (files && files.length > 0) {
const image = files[0];
const currentCard = Cards.findOne(Session.get('currentCard'));
const currentCard = Utils.getCurrentCard();
const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL;
const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO;
const insertImage = src => {
@@ -323,13 +332,13 @@ Blaze.Template.registerHelper(
return HTML.Raw(
DOMPurify.sanitize(content, { ALLOW_UNKNOWN_PROTOCOLS: true }),
);
const knowedUsers = currentBoard.members.map(member => {
const knowedUsers = _.union(currentBoard.members.map(member => {
const u = Users.findOne(member.userId);
if (u) {
member.username = u.username;
}
return member;
});
}), [...specialHandles]);
const mentionRegex = /\B@([\w.]*)/gi;
let currentMention;
+6 -3
View File
@@ -16,12 +16,14 @@ template(name="header")
each currentBoard.lists
li(class="{{#if $.Session.equals 'currentList' _id}}current{{/if}}")
a.js-select-list
= title
+viewer
= title
else
each currentUser.starredBoards
li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}")
a(href="{{pathFor 'board' id=_id slug=slug}}")
= title
+viewer
= title
#header-new-board-icon
else
//-
@@ -49,7 +51,8 @@ template(name="header")
each currentUser.starredBoards
li(class="{{#if $.Session.equals 'currentBoard' _id}}current{{/if}}")
a(href="{{pathFor 'board' id=_id slug=slug}}")
= title
+viewer
= title
else
li.current.empty {{_ 'quick-access-description'}}
+8
View File
@@ -135,6 +135,14 @@
padding: 12px 10px
margin: -10px 0px
.viewer
display: inline
white-space: nowrap
p
display: inline
white-space: nowrap
&.current
color: darken(white, 5%)
+3 -2
View File
@@ -34,8 +34,9 @@ template(name="userFormsLayout")
img(src="{{currentSetting.customLoginLogoImageUrl}}" width="300" height="auto")
br
unless currentSetting.customLoginLogoImageUrl
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
br
div#isSettingDatabaseCallDone
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
br
if currentSetting.textBelowCustomLoginLogo
+viewer
| {{currentSetting.textBelowCustomLoginLogo}}
+70
View File
@@ -6,6 +6,9 @@ const i18nTagToT9n = i18nTag => {
return i18nTag;
};
let alreadyCheck = 1;
let isCheckDone = false;
const validator = {
set(obj, prop, value) {
if (prop === 'state' && value !== 'signIn') {
@@ -20,6 +23,8 @@ const validator = {
},
};
// let isSettingDatabaseFctCallDone = false;
Template.userFormsLayout.onCreated(function() {
const templateInstance = this;
templateInstance.currentSetting = new ReactiveVar();
@@ -28,6 +33,18 @@ Template.userFormsLayout.onCreated(function() {
Meteor.subscribe('setting', {
onReady() {
templateInstance.currentSetting.set(Settings.findOne());
let currSetting = templateInstance.currentSetting.curValue;
let oidcBtnElt = $("#at-oidc");
if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){
let htmlvalue = "<i class='fa fa-oidc'></i>" + currSetting.oidcBtnText;
oidcBtnElt.html(htmlvalue);
}
// isSettingDatabaseFctCallDone = true;
if(currSetting && currSetting !== undefined && currSetting.customLoginLogoImageUrl !== undefined)
document.getElementById("isSettingDatabaseCallDone").style.display = 'none';
else
document.getElementById("isSettingDatabaseCallDone").style.display = 'block';
return this.stop();
},
});
@@ -56,6 +73,10 @@ Template.userFormsLayout.helpers({
return Template.instance().currentSetting.get();
},
// isSettingDatabaseCallDone(){
// return isSettingDatabaseFctCallDone;
// },
isLoading() {
return Template.instance().isLoading.get();
},
@@ -86,6 +107,8 @@ Template.userFormsLayout.helpers({
name = 'Français (Belgique)';
} else if (lang.name === 'fr-CA') {
name = 'Français (Canada)';
} else if (lang.name === 'fr-CH') {
name = 'Français (Schweiz)';
} else if (lang.name === 'ig') {
name = 'Igbo';
} else if (lang.name === 'lv') {
@@ -157,6 +180,53 @@ Template.userFormsLayout.events({
templateInstance.isLoading.set(false);
});
}
isCheckDone = false;
},
'click #at-signUp'(event, templateInstance){
isCheckDone = false;
},
'DOMSubtreeModified #at-oidc'(event){
if(alreadyCheck <= 2){
let currSetting = Settings.findOne();
let oidcBtnElt = $("#at-oidc");
if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){
let htmlvalue = "<i class='fa fa-oidc'></i>" + currSetting.oidcBtnText;
if(alreadyCheck == 1){
alreadyCheck++;
oidcBtnElt.html("");
}
else{
alreadyCheck++;
oidcBtnElt.html(htmlvalue);
}
}
}
else{
alreadyCheck = 1;
}
},
'DOMSubtreeModified .at-form'(event){
if(alreadyCheck <= 2 && !isCheckDone){
if(document.getElementById("at-oidc") != null){
let currSetting = Settings.findOne();
let oidcBtnElt = $("#at-oidc");
if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){
let htmlvalue = "<i class='fa fa-oidc'></i>" + currSetting.oidcBtnText;
if(alreadyCheck == 1){
alreadyCheck++;
oidcBtnElt.html("");
}
else{
alreadyCheck++;
isCheckDone = true;
oidcBtnElt.html(htmlvalue);
}
}
}
}
else{
alreadyCheck = 1;
}
},
});
+7 -1
View File
@@ -317,6 +317,9 @@ kbd
.grabbing
cursor: grabbing
.textcomplete-dropdown
z-index: 2000 !important;
// Implement a thiner close icon as suggested in
// https://github.com/FortAwesome/Font-Awesome/issues/1540#issuecomment-68689950
.fa.fa-times-thin:before
@@ -430,7 +433,7 @@ a
margin-top: 0px
.wrapper
height: 100%
height: calc(100% - 31px)
margin: 0px
.panel-default
@@ -539,3 +542,6 @@ a
100%
transform: rotate(360deg)
#isSettingDatabaseCallDone
display: none;
+1 -12
View File
@@ -14,8 +14,7 @@ $popupWidth = 300px
margin-top: 5px
hr
margin: 4px -10px
width: $popupWidth
margin: 4px 0px
p,
textarea,
@@ -23,7 +22,6 @@ $popupWidth = 300px
input[type="email"],
input[type="password"],
input[type="file"]
margin: 4px 0 12px
width: 100%
select
@@ -313,22 +311,13 @@ $popupWidth = 300px
input[type="email"],
input[type="password"],
input[type="file"]
margin: 4px 0 12px
width: 100%
box-sizing: border-box
.pop-over-list
li > a
width: calc(100% - 20px)
padding: 10px 10px
margin: 0px 0px
border-bottom: 1px solid #eee
hr
width: 100%
height: 20px
margin: 0px 0px
color: #eee
for depth in (1..6)
.popup-container-depth-{depth}
@@ -232,7 +232,7 @@ BlazeComponent.extendComponent({
},
'click .js-submit'() {
this.colorButtonValue.set(this.currentColor.get());
Popup.close();
Popup.back();
},
},
];
@@ -116,6 +116,6 @@ Template.boardCardTitlePopup.events({
.trim();
Popup.getOpenerComponent().setNameFilter(title);
event.preventDefault();
Popup.close();
Popup.back();
},
});
@@ -21,7 +21,7 @@ template(name='statistics')
table
tbody
tr
th Wekan {{_ 'info'}}
th WeKan ® {{_ 'info'}}
td {{statistics.version}}
tr
th {{_ 'Meteor_version'}}
@@ -65,3 +65,48 @@ template(name='statistics')
tr
th {{_ 'OS_Cpus'}}
td {{statistics.os.cpus.length}}
tr
th {{_ 'Node_heap_total_heap_size'}}
td {{bytesToSize statistics.nodeHeapStats.totalHeapSize}}
tr
th {{_ 'Node_heap_total_heap_size_executable'}}
td {{bytesToSize statistics.nodeHeapStats.totalHeapSizeExecutable}}
tr
th {{_ 'Node_heap_total_physical_size'}}
td {{bytesToSize statistics.nodeHeapStats.totalPhysicalSize}}
tr
th {{_ 'Node_heap_total_available_size'}}
td {{bytesToSize statistics.nodeHeapStats.totalAvailableSize}}
tr
th {{_ 'Node_heap_used_heap_size'}}
td {{bytesToSize statistics.nodeHeapStats.usedHeapSize}}
tr
th {{_ 'Node_heap_heap_size_limit'}}
td {{bytesToSize statistics.nodeHeapStats.heapSizeLimit}}
tr
th {{_ 'Node_heap_malloced_memory'}}
td {{bytesToSize statistics.nodeHeapStats.mallocedMemory}}
tr
th {{_ 'Node_heap_peak_malloced_memory'}}
td {{bytesToSize statistics.nodeHeapStats.peakMallocedMemory}}
tr
th {{_ 'Node_heap_does_zap_garbage'}}
td {{statistics.nodeHeapStats.doesZapGarbage}}
tr
th {{_ 'Node_heap_number_of_native_contexts'}}
td {{statistics.nodeHeapStats.numberOfNativeContexts}}
tr
th {{_ 'Node_heap_number_of_detached_contexts'}}
td {{statistics.nodeHeapStats.numberOfDetachedContexts}}
tr
th {{_ 'Node_memory_usage_rss'}}
td {{bytesToSize statistics.nodeMemoryUsage.rss}}
tr
th {{_ 'Node_memory_usage_heap_total'}}
td {{bytesToSize statistics.nodeMemoryUsage.heapTotal}}
tr
th {{_ 'Node_memory_usage_heap_used'}}
td {{bytesToSize statistics.nodeMemoryUsage.heapUsed}}
tr
th {{_ 'Node_memory_usage_external'}}
td {{bytesToSize statistics.nodeMemoryUsage.external}}
+43 -2
View File
@@ -40,6 +40,11 @@ template(name="people")
| {{_ 'search'}}
.ext-box-right
span {{#unless isMiniScreen}}{{_ 'people-number'}}{{/unless}} #{peopleNumber}
.divAddOrRemoveTeam#divAddOrRemoveTeam
button#addOrRemoveTeam
i.fa.fa-edit
| {{_ 'add'}} / {{_ 'delete'}} {{_ 'teams'}}
.content-body
.side-menu
ul
@@ -97,9 +102,13 @@ template(name="teamGeneral")
+teamRow(teamId=team._id)
template(name="peopleGeneral")
#divAddOrRemoveTeamContainer
+modifyTeamsUsers
table
tbody
tr
th
+selectAllUser
th {{_ 'username'}}
th {{_ 'fullname'}}
th {{_ 'initials'}}
@@ -117,6 +126,10 @@ template(name="peopleGeneral")
each user in peopleList
+peopleRow(userId=user._id)
template(name="selectAllUser")
| {{_ 'dueCardsViewChange-choice-all'}}
input.allUserChkBox(type="checkbox", id="chkSelectAll")
template(name="newOrgRow")
a.new-org
i.fa.fa-plus-square
@@ -202,6 +215,12 @@ template(name="teamRow")
template(name="peopleRow")
tr
if userData.loginDisabled
td
input.selectUserChkBox(type="checkbox", disabled="disabled", id="{{userData._id}}")
else
td
input.selectUserChkBox(type="checkbox", id="{{userData._id}}")
if userData.loginDisabled
td.username <s>{{ userData.username }}</s>
else
@@ -342,7 +361,7 @@ template(name="editUserPopup")
input.js-profile-fullname(type="text" value=user.profile.fullname required)
label
| {{_ 'initials'}}
input.js-profile-initials(type="text" value=user.profile.initials required)
input.js-profile-initials(type="text" value=user.profile.initials)
label
| {{_ 'admin'}}
select.select-role.js-profile-isadmin
@@ -453,6 +472,24 @@ template(name="newTeamPopup")
div.buttonsContainer
input.primary.wide(type="submit" value="{{_ 'save'}}")
template(name="modifyTeamsUsers")
label
| {{_ 'teams'}}
select.js-teamsUser#jsteamsUser
each value in teamsDatas
option(value="{{value._id}}") {{_ value.teamDisplayName}}
hr
label
| {{_ 'r-action'}}
.form-group.flex
input.wekan-form-control#addAction(type="radio" name="action" value="true" checked="checked")
span {{_ 'add'}}
input.wekan-form-control#deleteAction(type="radio" name="action" value="false")
span {{_ 'delete'}}
div.buttonsContainer
input.primary.wide#addTeamBtn(type="submit" value="{{_ 'save'}}")
input.primary.wide#cancelBtn(type="submit" value="{{_ 'cancel'}}")
template(name="newUserPopup")
form
//label.hide.userId(type="text" value=user._id)
@@ -469,7 +506,7 @@ template(name="newUserPopup")
input.js-profile-username(type="text" value="" required)
label
| {{_ 'initials'}}
input.js-profile-initials(type="text" value="" required)
input.js-profile-initials(type="text" value="")
label
| {{_ 'email'}}
span.error.hide.email-taken
@@ -571,10 +608,14 @@ template(name="settingsUserPopup")
a.impersonate-user
i.fa.fa-user
| {{_ 'impersonate-user'}}
br
hr
li
form
label.hide.userId(type="text" value=user._id)
label
| {{_ 'delete-user-confirm-popup' }}
br
div.buttonsContainer
input#deleteButton.card-details-red.right.wide(type="button" value="{{_ 'delete'}}")
// Delete is enabled, but there is still bug of leaving empty user avatars
+172 -27
View File
@@ -2,6 +2,7 @@ const orgsPerPage = 25;
const teamsPerPage = 25;
const usersPerPage = 25;
let userOrgsTeamsAction = ""; //poosible actions 'addOrg', 'addTeam', 'removeOrg' or 'removeTeam' when adding or modifying a user
let selectedUserChkBoxUserIds = [];
BlazeComponent.extendComponent({
mixins() {
@@ -81,6 +82,9 @@ BlazeComponent.extendComponent({
'click #searchButton'() {
this.filterPeople();
},
'click #addOrRemoveTeam'(){
document.getElementById("divAddOrRemoveTeamContainer").style.display = 'block';
},
'keydown #searchInput'(event) {
if (event.keyCode === 13 && !event.shiftKey) {
this.filterPeople();
@@ -385,11 +389,111 @@ BlazeComponent.extendComponent({
{
'click a.edit-user': Popup.open('editUser'),
'click a.more-settings-user': Popup.open('settingsUser'),
'click .selectUserChkBox': function(ev){
if(ev.currentTarget){
if(ev.currentTarget.checked){
if(!selectedUserChkBoxUserIds.includes(ev.currentTarget.id)){
selectedUserChkBoxUserIds.push(ev.currentTarget.id);
}
}
else{
if(selectedUserChkBoxUserIds.includes(ev.currentTarget.id)){
let index = selectedUserChkBoxUserIds.indexOf(ev.currentTarget.id);
if(index > -1)
selectedUserChkBoxUserIds.splice(index, 1);
}
}
}
if(selectedUserChkBoxUserIds.length > 0)
document.getElementById("divAddOrRemoveTeam").style.display = 'block';
else
document.getElementById("divAddOrRemoveTeam").style.display = 'none';
},
},
];
},
}).register('peopleRow');
BlazeComponent.extendComponent({
onCreated() {},
teamsDatas() {
return Team.find({}, {sort: { createdAt: -1 }});
},
events() {
return [
{
'click #cancelBtn': function(){
let selectedElt = document.getElementById("jsteamsUser");
document.getElementById("divAddOrRemoveTeamContainer").style.display = 'none';
},
'click #addTeamBtn': function(){
let selectedElt;
let selectedEltValue;
let selectedEltValueId;
let userTms = [];
let currentUser;
let currUserTeamIndex;
selectedElt = document.getElementById("jsteamsUser");
selectedEltValue = selectedElt.options[selectedElt.selectedIndex].text;
selectedEltValueId = selectedElt.options[selectedElt.selectedIndex].value;
if(document.getElementById('addAction').checked){
for(let i = 0; i < selectedUserChkBoxUserIds.length; i++){
currentUser = Users.findOne(selectedUserChkBoxUserIds[i]);
userTms = currentUser.teams;
if(userTms == undefined || userTms.length == 0){
userTms = [];
userTms.push({
"teamId": selectedEltValueId,
"teamDisplayName": selectedEltValue,
})
}
else if(userTms.length > 0)
{
currUserTeamIndex = userTms.findIndex(function(t){ return t.teamId == selectedEltValueId});
if(currUserTeamIndex == -1){
userTms.push({
"teamId": selectedEltValueId,
"teamDisplayName": selectedEltValue,
});
}
}
Users.update(selectedUserChkBoxUserIds[i], {
$set:{
teams: userTms
}
});
}
}
else{
for(let i = 0; i < selectedUserChkBoxUserIds.length; i++){
currentUser = Users.findOne(selectedUserChkBoxUserIds[i]);
userTms = currentUser.teams;
if(userTms !== undefined || userTms.length > 0)
{
currUserTeamIndex = userTms.findIndex(function(t){ return t.teamId == selectedEltValueId});
if(currUserTeamIndex != -1){
userTms.splice(currUserTeamIndex, 1);
}
}
Users.update(selectedUserChkBoxUserIds[i], {
$set:{
teams: userTms
}
});
}
}
document.getElementById("divAddOrRemoveTeamContainer").style.display = 'none';
},
},
];
},
}).register('modifyTeamsUsers');
BlazeComponent.extendComponent({
events() {
return [
@@ -420,6 +524,41 @@ BlazeComponent.extendComponent({
},
}).register('newUserRow');
BlazeComponent.extendComponent({
events() {
return [
{
'click .allUserChkBox': function(ev){
selectedUserChkBoxUserIds = [];
const checkboxes = document.getElementsByClassName("selectUserChkBox");
if(ev.currentTarget){
if(ev.currentTarget.checked){
for (let i=0; i<checkboxes.length; i++) {
if (!checkboxes[i].disabled) {
selectedUserChkBoxUserIds.push(checkboxes[i].id);
checkboxes[i].checked = true;
}
}
}
else{
for (let i=0; i<checkboxes.length; i++) {
if (!checkboxes[i].disabled) {
checkboxes[i].checked = false;
}
}
}
}
if(selectedUserChkBoxUserIds.length > 0)
document.getElementById("divAddOrRemoveTeam").style.display = 'block';
else
document.getElementById("divAddOrRemoveTeam").style.display = 'none';
},
},
];
},
}).register('selectAllUser');
Template.editOrgPopup.events({
submit(event, templateInstance) {
event.preventDefault();
@@ -431,8 +570,7 @@ Template.editOrgPopup.events({
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
const orgIsActive =
templateInstance.find('.js-org-isactive').value.trim() == 'true';
const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true';
const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName;
const isChangeOrgDesc = orgDesc !== org.orgDesc;
@@ -458,7 +596,7 @@ Template.editOrgPopup.events({
);
}
Popup.close();
Popup.back();
},
});
@@ -502,7 +640,7 @@ Template.editTeamPopup.events({
);
}
Popup.close();
Popup.back();
},
});
@@ -617,7 +755,7 @@ Template.editUserPopup.events({
} else {
usernameMessageElement.hide();
emailMessageElement.hide();
Popup.close();
Popup.back();
}
},
);
@@ -631,7 +769,7 @@ Template.editUserPopup.events({
}
} else {
usernameMessageElement.hide();
Popup.close();
Popup.back();
}
});
} else if (isChangeEmail) {
@@ -648,11 +786,11 @@ Template.editUserPopup.events({
}
} else {
emailMessageElement.hide();
Popup.close();
Popup.back();
}
},
);
} else Popup.close();
} else Popup.back();
},
'click #addUserOrg'(event) {
event.preventDefault();
@@ -787,7 +925,7 @@ Template.newOrgPopup.events({
orgWebsite,
orgIsActive,
);
Popup.close();
Popup.back();
},
});
@@ -813,7 +951,7 @@ Template.newTeamPopup.events({
teamWebsite,
teamIsActive,
);
Popup.close();
Popup.back();
},
});
@@ -839,20 +977,24 @@ Template.newUserPopup.events({
let userTeamsIdsList = userTeamsIds.split(",");
let userTms = [];
for(let i = 0; i < userTeamsList.length; i++){
userTms.push({
"teamId": userTeamsIdsList[i],
"teamDisplayName": userTeamsList[i],
})
if(!!userTeamsIdsList[i] && !!userTeamsList[i]) {
userTms.push({
"teamId": userTeamsIdsList[i],
"teamDisplayName": userTeamsList[i],
})
}
}
let userOrgsList = userOrgs.split(",");
let userOrgsIdsList = userOrgsIds.split(",");
let userOrganizations = [];
for(let i = 0; i < userOrgsList.length; i++){
userOrganizations.push({
"orgId": userOrgsIdsList[i],
"orgDisplayName": userOrgsList[i],
})
if(!!userOrgsIdsList[i] && !!userOrgsList[i]) {
userOrganizations.push({
"orgId": userOrgsIdsList[i],
"orgDisplayName": userOrgsList[i],
})
}
}
Meteor.call(
@@ -882,11 +1024,11 @@ Template.newUserPopup.events({
} else {
usernameMessageElement.hide();
emailMessageElement.hide();
Popup.close();
Popup.back();
}
},
);
Popup.close();
Popup.back();
},
'click #addUserOrgNewUser'(event) {
event.preventDefault();
@@ -940,7 +1082,7 @@ Template.settingsOrgPopup.events({
return;
}
Org.remove(this.orgId);
Popup.close();
Popup.back();
}
});
@@ -958,7 +1100,7 @@ Template.settingsTeamPopup.events({
return;
}
Team.remove(this.teamId);
Popup.close();
Popup.back();
}
});
@@ -975,10 +1117,13 @@ Template.settingsUserPopup.events({
},
'click #deleteButton'(event) {
event.preventDefault();
Users.remove(this.userId);
/*
// Delete is not enabled yet, because it does leave empty user avatars
// to boards: boards members, card members and assignees have
// empty users. See:
// Delete user is enabled, but you should remove user from all boards
// before deleting user, because there is possibility of leaving empty user avatars
// to boards. You can remove non-existing user ids manually from database,
// if that happens.
//. See:
// - wekan/client/components/settings/peopleBody.jade deleteButton
// - wekan/client/components/settings/peopleBody.js deleteButton
// - wekan/client/components/sidebar/sidebar.js Popup.afterConfirm('removeMember'
@@ -986,9 +1131,9 @@ Template.settingsUserPopup.events({
// but that should be used to remove user from all boards similarly
// - wekan/models/users.js Delete is not enabled
//
//Users.remove(this.userId);
//
*/
Popup.close();
Popup.back();
},
});
@@ -55,3 +55,32 @@ table
.js-teams,.js-teamsNewUser
display: none;
.selectUserChkBox,.allUserChkBox
position: static !important;
visibility: visible !important;
left: 0 !important;
display: block !important;
#divAddOrRemoveTeam
background: green;
display: none;
#addOrRemoveTeam
background: green;
color: white;
#divAddOrRemoveTeamContainer
display: none;
margin: auto;
width: 50%;
border: 3px solid green;
padding: 10px;
#cancelBtn
margin-left: 5% !important;
background: orange;
color: white;
#deleteAction
margin-left: 5% !important;
+26 -1
View File
@@ -22,6 +22,10 @@ template(name="setting")
a.js-setting-menu(data-id="account-setting")
i.fa.fa-users
| {{_ 'accounts'}}
li
a.js-setting-menu(data-id="tableVisibilityMode-setting")
i.fa.fa-eye
| {{_ 'tableVisibilityMode'}}
li
a.js-setting-menu(data-id="announcement-setting")
i.fa.fa-bullhorn
@@ -44,6 +48,8 @@ template(name="setting")
+email
else if accountSetting.get
+accountSettings
else if tableVisibilityModeSetting.get
+tableVisibilityModeSettings
else if announcementSetting.get
+announcementSettings
else if layoutSetting.get
@@ -96,7 +102,7 @@ template(name='email')
// li.smtp-form
// .title {{_ 'smtp-username'}}
// .form-group
// input.wekan-form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}")
// input.wekan-form-control#mail-server-u"accounts-allowUserNameChange": "Allow Username Change",sername(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}")
// li.smtp-form
// .title {{_ 'smtp-password'}}
// .form-group
@@ -120,6 +126,17 @@ template(name='email')
li
button.js-send-smtp-test-email.primary {{_ 'send-smtp-test'}}
template(name='tableVisibilityModeSettings')
ul#tableVisibilityMode-setting.setting-detail
li.tableVisibilityMode-form
.title {{_ 'tableVisibilityMode-allowPrivateOnly'}}
.form-group.flex
input.wekan-form-control#accounts-allowPrivateOnly(type="radio" name="allowPrivateOnly" value="true" checked="{{#if allowPrivateOnly}}checked{{/if}}")
span {{_ 'yes'}}
input.wekan-form-control#accounts-allowPrivateOnly(type="radio" name="allowPrivateOnly" value="false" checked="{{#unless allowPrivateOnly}}checked{{/unless}}")
span {{_ 'no'}}
button.js-tableVisibilityMode-save.primary {{_ 'save'}}
template(name='accountSettings')
ul#account-setting.setting-detail
li
@@ -163,6 +180,14 @@ template(name='announcementSettings')
template(name='layoutSettings')
ul#layout-setting.setting-detail
li.layout-form
.title {{_ 'oidc-button-text'}}
.form-group
input.wekan-form-control#oidcBtnTextvalue(type="text", placeholder="" value="{{currentSetting.oidcBtnText}}")
li.layout-form
.title {{_ 'can-invite-if-same-mailDomainName'}}
.form-group
input.wekan-form-control#mailDomainNamevalue(type="text", placeholder="" value="{{currentSetting.mailDomainName}}")
li.layout-form
.title {{_ 'display-authentication-method'}}
.form-group.flex
+56
View File
@@ -7,6 +7,7 @@ BlazeComponent.extendComponent({
this.generalSetting = new ReactiveVar(true);
this.emailSetting = new ReactiveVar(false);
this.accountSetting = new ReactiveVar(false);
this.tableVisibilityModeSetting = new ReactiveVar(false);
this.announcementSetting = new ReactiveVar(false);
this.layoutSetting = new ReactiveVar(false);
this.webhookSetting = new ReactiveVar(false);
@@ -14,6 +15,7 @@ BlazeComponent.extendComponent({
Meteor.subscribe('setting');
Meteor.subscribe('mailServer');
Meteor.subscribe('accountSettings');
Meteor.subscribe('tableVisibilityModeSettings');
Meteor.subscribe('announcements');
Meteor.subscribe('globalwebhooks');
},
@@ -88,6 +90,7 @@ BlazeComponent.extendComponent({
this.announcementSetting.set('announcement-setting' === targetID);
this.layoutSetting.set('layout-setting' === targetID);
this.webhookSetting.set('webhook-setting' === targetID);
this.tableVisibilityModeSetting.set('tableVisibilityMode-setting' === targetID);
}
},
@@ -196,6 +199,17 @@ BlazeComponent.extendComponent({
)
.val()
.trim();
const oidcBtnText = $(
'#oidcBtnTextvalue',
)
.val()
.trim();
const mailDomainName = $(
'#mailDomainNamevalue',
)
.val()
.trim();
const hideLogoChange = $('input[name=hideLogo]:checked').val() === 'true';
const displayAuthenticationMethod =
$('input[name=displayAuthenticationMethod]:checked').val() === 'true';
@@ -218,6 +232,8 @@ BlazeComponent.extendComponent({
defaultAuthenticationMethod,
automaticLinkedUrlSchemes,
spinnerName,
oidcBtnText,
mailDomainName,
},
});
} catch (e) {
@@ -317,6 +333,46 @@ BlazeComponent.extendComponent({
},
}).register('accountSettings');
BlazeComponent.extendComponent({
saveTableVisibilityChange() {
const allowPrivateOnly =
$('input[name=allowPrivateOnly]:checked').val() === 'true';
TableVisibilityModeSettings.update('tableVisibilityMode-allowPrivateOnly', {
$set: { booleanValue: allowPrivateOnly },
});
},
allowPrivateOnly() {
return TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly').booleanValue;
},
allHideSystemMessages() {
Meteor.call('setAllUsersHideSystemMessages', (err, ret) => {
if (!err && ret) {
if (ret === true) {
const message = `${TAPi18n.__(
'now-system-messages-of-all-users-are-hidden',
)}`;
alert(message);
}
} else {
const reason = err.reason || '';
const message = `${TAPi18n.__(err.error)}\n${reason}`;
alert(message);
}
});
},
events() {
return [
{
'click button.js-tableVisibilityMode-save': this.saveTableVisibilityChange,
},
{
'click button.js-all-hide-system-messages': this.allHideSystemMessages,
},
];
},
}).register('tableVisibilityModeSettings');
BlazeComponent.extendComponent({
onCreated() {
this.loading = new ReactiveVar(false);
+1 -1
View File
@@ -11,7 +11,7 @@
color: #727479
background: #dedede
width 100%
height 100%
height calc(100% - 80px)
position: absolute;
.content-title
+43 -25
View File
@@ -31,26 +31,28 @@ template(name='homeSidebar')
+activities(mode="board")
template(name="membersWidget")
.board-widget.board-widget-members
h3
i.fa.fa-users
| {{_ 'organizations'}}
if AtLeastOneOrgWasCreated
.board-widget.board-widget-members
h3
i.fa.fa-users
| {{_ 'organizations'}}
.board-widget-content
+boardOrgGeneral
.clearfix
br
hr
.board-widget.board-widget-members
h3
i.fa.fa-users
| {{_ 'teams'}}
.board-widget-content
+boardOrgGeneral
.clearfix
br
hr
if AtLeastOneTeamWasCreated
.board-widget.board-widget-members
h3
i.fa.fa-users
| {{_ 'teams'}}
.board-widget-content
+boardTeamGeneral
.clearfix
br
hr
.board-widget-content
+boardTeamGeneral
.clearfix
br
hr
.board-widget.board-widget-members
h3
i.fa.fa-users
@@ -93,7 +95,9 @@ template(name="boardOrgGeneral")
th
if currentUser.isBoardAdmin
a.member.orgOrTeamMember.add-member.js-manage-board-addOrg(title="{{_ 'add-members'}}")
i.fa.fa-plus
i.addTeamFaPlus.fa.fa-plus
.divaddfaplusminus
| {{_ 'add'}}
each org in currentBoard.activeOrgs
+boardOrgRow(orgId=org.orgId)
@@ -101,11 +105,21 @@ template(name="boardTeamGeneral")
table
tbody
tr
th {{_ 'displayName'}}
th
b
| {{_ 'add-teams'}}
br
i.addTeamsLabelcss
| {{_ 'to-create-teams-contact-admin'}}
br
i.addTeamsLabelcss
| {{_ 'add-teams-label'}}
th
if currentUser.isBoardAdmin
a.member.orgOrTeamMember.add-member.js-manage-board-addTeam(title="{{_ 'add-members'}}")
i.fa.fa-plus
i.addTeamFaPlus.fa.fa-plus
.divaddfaplusminus
| {{_ 'add'}}
each currentBoard.activeTeams
+boardTeamRow(teamId=this.teamId)
@@ -398,7 +412,11 @@ template(name="exportBoard")
li
a(href="{{exportCsvUrl}}", download="{{exportCsvFilename}}")
i.fa.fa-share-alt
| {{_ 'export-board-csv'}}
| {{_ 'export-board-csv'}} ,
li
a(href="{{exportScsvUrl}}", download="{{exportCsvFilename}}")
i.fa.fa-share-alt
| {{_ 'export-board-csv'}} ;
li
a(href="{{exportTsvUrl}}", download="{{exportTsvFilename}}")
i.fa.fa-share-alt
@@ -487,12 +505,12 @@ template(name="removeBoardTeamPopup")
form
input.hide#hideTeamId(type="text" value=team._id)
label
| {{_ 'leave-board'}} ?
| {{_ 'remove-team-from-table'}}
br
hr
div.buttonsContainer
input.primary.wide.leaveBoardBtn#leaveBoardTeamBtn(type="submit" value="{{_ 'leave-board'}}")
input.primary.wide.cancelLeaveBoardBtn#cancelLeaveBoardTeamBtn(type="submit" value="{{_ 'Cancel'}}")
input.primary.wide.leaveBoardBtn#leaveBoardTeamBtn(type="submit" value="{{_ 'confirm-btn'}}")
input.primary.wide.cancelLeaveBoardBtn#cancelLeaveBoardTeamBtn(type="submit" value="{{_ 'cancel'}}")
template(name="addMemberPopup")
.js-search-member
+147 -17
View File
@@ -183,19 +183,20 @@ Template.memberPopup.helpers({
},
});
Template.boardMenuPopup.events({
'click .js-rename-board': Popup.open('boardChangeTitle'),
'click .js-open-rules-view'() {
Modal.openWide('rulesMain');
Popup.close();
Popup.back();
},
'click .js-custom-fields'() {
Sidebar.setView('customFields');
Popup.close();
Popup.back();
},
'click .js-open-archives'() {
Sidebar.setView('archives');
Popup.close();
Popup.back();
},
'click .js-change-board-color': Popup.open('boardChangeColor'),
'click .js-change-language': Popup.open('changeLanguage'),
@@ -208,7 +209,7 @@ Template.boardMenuPopup.events({
}),
'click .js-delete-board': Popup.afterConfirm('deleteBoard', function() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
Popup.close();
Popup.back();
Boards.remove(currentBoard._id);
FlowRouter.go('home');
}),
@@ -251,7 +252,7 @@ Template.boardMenuPopup.helpers({
Template.memberPopup.events({
'click .js-filter-member'() {
Filter.members.toggle(this.userId);
Popup.close();
Popup.back();
},
'click .js-change-role': Popup.open('changePermissions'),
'click .js-remove-member': Popup.afterConfirm('removeMember', function() {
@@ -265,12 +266,12 @@ Template.memberPopup.events({
card.unassignAssignee(memberId);
});
Boards.findOne(boardId).removeMember(memberId);
Popup.close();
Popup.back();
}),
'click .js-leave-member': Popup.afterConfirm('leaveBoard', () => {
const boardId = Session.get('currentBoard');
Meteor.call('quitBoard', boardId, () => {
Popup.close();
Popup.back();
FlowRouter.go('home');
});
}),
@@ -290,6 +291,42 @@ Template.leaveBoardPopup.helpers({
return Boards.findOne(Session.get('currentBoard'));
},
});
BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
this.findOrgsOptions = new ReactiveVar({});
this.findTeamsOptions = new ReactiveVar({});
this.page = new ReactiveVar(1);
this.teamPage = new ReactiveVar(1);
this.autorun(() => {
const limitOrgs = this.page.get() * Number.MAX_SAFE_INTEGER;
this.subscribe('org', this.findOrgsOptions.get(), limitOrgs, () => {});
});
this.autorun(() => {
const limitTeams = this.teamPage.get() * Number.MAX_SAFE_INTEGER;
this.subscribe('team', this.findTeamsOptions.get(), limitTeams, () => {});
});
},
onRendered() {
this.setLoading(false);
},
setError(error) {
this.error.set(error);
},
setLoading(w) {
this.loading.set(w);
},
isLoading() {
return this.loading.get();
},
}).register('membersWidget');
Template.membersWidget.helpers({
isInvited() {
@@ -307,6 +344,21 @@ Template.membersWidget.helpers({
isBoardAdmin() {
return Meteor.user().isBoardAdmin();
},
AtLeastOneOrgWasCreated(){
let orgs = Org.find({}, {sort: { createdAt: -1 }});
if(orgs === undefined)
return false;
return orgs.count() > 0;
},
AtLeastOneTeamWasCreated(){
let teams = Team.find({}, {sort: { createdAt: -1 }});
if(teams === undefined)
return false;
return teams.count() > 0;
},
});
Template.membersWidget.events({
@@ -408,7 +460,7 @@ BlazeComponent.extendComponent({
activities: ['all'],
});
}
Popup.close();
Popup.back();
},
},
];
@@ -460,6 +512,21 @@ BlazeComponent.extendComponent({
};
const queryParams = {
authToken: Accounts._storedLoginToken(),
delimiter: ',',
};
return FlowRouter.path(
'/api/boards/:boardId/export/csv',
params,
queryParams,
);
},
exportScsvUrl() {
const params = {
boardId: Session.get('currentBoard'),
};
const queryParams = {
authToken: Accounts._storedLoginToken(),
delimiter: ';',
};
return FlowRouter.path(
'/api/boards/:boardId/export/csv',
@@ -1162,7 +1229,7 @@ BlazeComponent.extendComponent({
self.setLoading(false);
if (err) self.setError(err.error);
else if (ret.email) self.setError('email-sent');
else Popup.close();
else Popup.back();
});
},
@@ -1249,7 +1316,7 @@ BlazeComponent.extendComponent({
}
}
Popup.close();
Popup.back();
},
},
];
@@ -1313,10 +1380,10 @@ BlazeComponent.extendComponent({
Meteor.call('setBoardOrgs', boardOrganizations, currentBoard._id);
Popup.close();
Popup.back();
},
'click #cancelLeaveBoardBtn'(){
Popup.close();
Popup.back();
},
},
];
@@ -1340,6 +1407,13 @@ BlazeComponent.extendComponent({
const limitTeams = this.page.get() * Number.MAX_SAFE_INTEGER;
this.subscribe('team', this.findOrgsOptions.get(), limitTeams, () => {});
});
this.findUsersOptions = new ReactiveVar({});
this.userPage = new ReactiveVar(1);
this.autorun(() => {
const limitUsers = this.userPage.get() * Number.MAX_SAFE_INTEGER;
this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {});
});
},
onRendered() {
@@ -1384,11 +1458,39 @@ BlazeComponent.extendComponent({
})
if (selectedTeamId != "-1") {
Meteor.call('setBoardTeams', boardTeams, currentBoard._id);
let members = currentBoard.members;
let query = {
"teams.teamId": { $in: boardTeams.map(t => t.teamId) },
};
const boardTeamUsers = Users.find(query, {
sort: { sort: 1 },
});
if(boardTeams !== undefined && boardTeams.length > 0){
let index;
if(boardTeamUsers && boardTeamUsers.count() > 0){
boardTeamUsers.forEach((u) => {
index = members.findIndex(function(m){ return m.userId == u._id});
if(index == -1){
members.push({
"isActive": true,
"isAdmin": u.isAdmin !== undefined ? u.isAdmin : false,
"isCommentOnly" : false,
"isNoComments" : false,
"userId": u._id,
});
}
});
}
}
Meteor.call('setBoardTeams', boardTeams, members, currentBoard._id);
}
}
Popup.close();
Popup.back();
},
},
];
@@ -1413,6 +1515,13 @@ BlazeComponent.extendComponent({
const limitTeams = this.page.get() * Number.MAX_SAFE_INTEGER;
this.subscribe('team', this.findOrgsOptions.get(), limitTeams, () => {});
});
this.findUsersOptions = new ReactiveVar({});
this.userPage = new ReactiveVar(1);
this.autorun(() => {
const limitUsers = this.userPage.get() * Number.MAX_SAFE_INTEGER;
this.subscribe('people', this.findUsersOptions.get(), limitUsers, () => {});
});
},
onRendered() {
@@ -1449,12 +1558,33 @@ BlazeComponent.extendComponent({
}
}
Meteor.call('setBoardTeams', boardTeams, currentBoard._id);
let members = currentBoard.members;
let query = {
"teams.teamId": stringTeamId
};
Popup.close();
const boardTeamUsers = Users.find(query, {
sort: { sort: 1 },
});
if(currentBoard.teams !== undefined && currentBoard.teams.length > 0){
let index;
if(boardTeamUsers && boardTeamUsers.count() > 0){
boardTeamUsers.forEach((u) => {
index = members.findIndex(function(m){ return m.userId == u._id});
if(index !== -1 && (u.isAdmin === undefined || u.isAdmin == false)){
members.splice(index, 1);
}
});
}
}
Meteor.call('setBoardTeams', boardTeams, members, currentBoard._id);
Popup.back();
},
'click #cancelLeaveBoardTeamBtn'(){
Popup.close();
Popup.back();
},
},
];
+19
View File
@@ -224,3 +224,22 @@
.cancelLeaveBoardBtn
margin-left: 5% !important
background-color: red !important
.addTeamsLabelcss
font-weight: normal;
.js-manage-board-removeTeam
box-shadow: 0 0 0 2px #e23210 inset !important
.js-manage-board-addTeam
box-shadow: 0 0 0 2px #73ea10 inset !important
.addTeamFaPlus
color: green !important
.removeTeamFaMinus
color: red !important
.divaddfaplusminus
padding-top: 5px;
margin-left: 40px;
+6 -6
View File
@@ -94,13 +94,13 @@ BlazeComponent.extendComponent({
'click .js-delete-card': Popup.afterConfirm('cardDelete', function() {
const cardId = this._id;
Cards.remove(cardId);
Popup.close();
Popup.back();
}),
'click .js-delete-all-cards': Popup.afterConfirm('cardDelete', () => {
this.archivedCards().forEach(card => {
Cards.remove(card._id);
});
Popup.close();
Popup.back();
}),
'click .js-restore-list'() {
@@ -115,13 +115,13 @@ BlazeComponent.extendComponent({
'click .js-delete-list': Popup.afterConfirm('listDelete', function() {
this.remove();
Popup.close();
Popup.back();
}),
'click .js-delete-all-lists': Popup.afterConfirm('listDelete', () => {
this.archivedLists().forEach(list => {
list.remove();
});
Popup.close();
Popup.back();
}),
'click .js-restore-swimlane'() {
@@ -138,7 +138,7 @@ BlazeComponent.extendComponent({
'swimlaneDelete',
function() {
this.remove();
Popup.close();
Popup.back();
},
),
'click .js-delete-all-swimlanes': Popup.afterConfirm(
@@ -147,7 +147,7 @@ BlazeComponent.extendComponent({
this.archivedSwimlanes().forEach(swimlane => {
swimlane.remove();
});
Popup.close();
Popup.back();
},
),
},
@@ -43,6 +43,14 @@ template(name="createCustomFieldPopup")
option(value=value selected="selected") {{name}}
else
option(value=value) {{name}}
a.flex.js-field-show-sum-at-top-of-list(class="{{#if showSumAtTopOfList}}is-checked{{/if}}")
.materialCheckBox(class="{{#if showSumAtTopOfList}}is-checked{{/if}}")
span {{_ 'showSum-field-on-list'}}
div.js-field-settings.js-field-settings-currency(class="{{#if isTypeNotSelected 'number'}}hide{{/if}}")
a.flex.js-field-show-sum-at-top-of-list(class="{{#if showSumAtTopOfList}}is-checked{{/if}}")
.materialCheckBox(class="{{#if showSumAtTopOfList}}is-checked{{/if}}")
span {{_ 'showSum-field-on-list'}}
div.js-field-settings.js-field-settings-dropdown(class="{{#if isTypeNotSelected 'dropdown'}}hide{{/if}}")
label
@@ -234,6 +234,14 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .js-field-show-sum-at-top-of-list'(evt) {
let $target = $(evt.target);
if (!$target.hasClass('js-field-show-sum-at-top-of-list')) {
$target = $target.parent();
}
$target.find('.materialCheckBox').toggleClass('is-checked');
$target.toggleClass('is-checked');
},
'click .primary'(evt) {
evt.preventDefault();
@@ -248,6 +256,8 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
this.find('.js-field-automatically-on-card.is-checked') !== null,
alwaysOnCard:
this.find('.js-field-always-on-card.is-checked') !== null,
showSumAtTopOfList:
this.find('.js-field-show-sum-at-top-of-list.is-checked') !== null,
};
// insert or update
@@ -273,7 +283,7 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({
} else {
CustomFields.remove(customField._id);
}
Popup.close();
Popup.back();
},
),
},
@@ -292,6 +302,6 @@ CreateCustomFieldPopup.register('createCustomFieldPopup');
'submit'(evt) {
const customFieldId = this._id;
CustomFields.remove(customFieldId);
Popup.close();
Popup.back();
}
});*/
@@ -4,11 +4,18 @@
and #each x in y constructors to fix this.
template(name="filterSidebar")
h3 {{_ 'list-filter-label'}}
h3
i.fa.fa-trello
| {{_ 'list-filter-label'}}
ul.sidebar-list
form.js-list-filter
input(type="text")
hr
h3
i.fa.fa-list-alt
| {{_ 'filter-card-title-label'}}
input.js-field-card-filter(type="text")
hr
h3
i.fa.fa-tags
| {{_ 'filter-labels-label'}}
+9 -4
View File
@@ -8,6 +8,11 @@ BlazeComponent.extendComponent({
evt.preventDefault();
Filter.lists.set(this.find('.js-list-filter input').value.trim());
},
'change .js-field-card-filter'(evt) {
evt.preventDefault();
Filter.title.set(this.find('.js-field-card-filter').value.trim());
Filter.resetExceptions();
},
'click .js-toggle-label-filter'(evt) {
evt.preventDefault();
Filter.labelIds.toggle(this.currentData()._id);
@@ -171,22 +176,22 @@ Template.multiselectionSidebar.helpers({
Template.disambiguateMultiLabelPopup.events({
'click .js-remove-label'() {
mutateSelectedCards('removeLabel', this._id);
Popup.close();
Popup.back();
},
'click .js-add-label'() {
mutateSelectedCards('addLabel', this._id);
Popup.close();
Popup.back();
},
});
Template.disambiguateMultiMemberPopup.events({
'click .js-unassign-member'() {
mutateSelectedCards('assignMember', this._id);
Popup.close();
Popup.back();
},
'click .js-assign-member'() {
mutateSelectedCards('unassignMember', this._id);
Popup.close();
Popup.back();
},
});
@@ -3,10 +3,14 @@ template(name="searchSidebar")
input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
.list-body
.minilists.clearfix.js-minilists
hr
| {{_ 'lists' }}
each (lists)
a.minilist-wrapper.js-minilist(href=originRelativeUrl)
+minilist(this)
.minicards.clearfix.js-minicards
each (results)
hr
| {{_ 'cards' }}
each (cards)
a.minicard-wrapper.js-minicard(href=originRelativeUrl)
+minicard(this)
+16 -1
View File
@@ -3,7 +3,7 @@ BlazeComponent.extendComponent({
this.term = new ReactiveVar('');
},
results() {
cards() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return currentBoard.searchCards(this.term.get());
},
@@ -13,9 +13,24 @@ BlazeComponent.extendComponent({
return currentBoard.searchLists(this.term.get());
},
clickOnMiniCard(evt) {
if (Utils.isMiniScreen()) {
evt.preventDefault();
Session.set('popupCard', this.currentData()._id);
this.cardDetailsPopup(evt);
}
},
cardDetailsPopup(event) {
if (!Popup.isOpen()) {
Popup.open("cardDetails")(event);
}
},
events() {
return [
{
'click .js-minicard': this.clickOnMiniCard,
'submit .js-search-term-form'(evt) {
evt.preventDefault();
this.term.set(evt.target.searchTerm.value);
@@ -26,7 +26,7 @@ template(name="swimlaneFixedHeader")
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}")
unless isMiniScreen
if showDesktopDragHandles
if isShowDesktopDragHandles
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
if isMiniScreen
a.swimlane-header-miniscreen-handle.handle.fa.fa-arrows.js-swimlane-header-handle
+4 -17
View File
@@ -28,19 +28,6 @@ BlazeComponent.extendComponent({
},
}).register('swimlaneHeader');
Template.swimlaneHeader.helpers({
showDesktopDragHandles() {
currentUser = Meteor.user();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
}
},
});
Template.swimlaneFixedHeader.helpers({
isBoardAdmin() {
return Meteor.user().isBoardAdmin();
@@ -52,7 +39,7 @@ Template.swimlaneActionPopup.events({
'click .js-close-swimlane'(event) {
event.preventDefault();
this.archive();
Popup.close();
Popup.back();
},
'click .js-move-swimlane': Popup.open('moveSwimlane'),
'click .js-copy-swimlane': Popup.open('copySwimlane'),
@@ -101,7 +88,7 @@ BlazeComponent.extendComponent({
// XXX ideally, we should move the popup to the newly
// created swimlane so a user can add more than one swimlane
// with a minimum of interactions
Popup.close();
Popup.back();
},
'click .js-swimlane-template': Popup.open('searchElement'),
},
@@ -131,11 +118,11 @@ BlazeComponent.extendComponent({
},
'click .js-submit'() {
this.currentSwimlane.setColor(this.currentColor.get());
Popup.close();
Popup.back();
},
'click .js-remove-color'() {
this.currentSwimlane.setColor(null);
Popup.close();
Popup.back();
},
},
];
+2 -1
View File
@@ -14,7 +14,8 @@ template(name="swimlane")
+addListForm
else
each lists
+list(this)
if visible this
+list(this)
if currentCardIsInThisList _id ../_id
+cardDetails(currentCard)
if currentUser.isBoardMember
+31 -44
View File
@@ -9,7 +9,7 @@ function currentListIsInThisSwimlane(swimlaneId) {
}
function currentCardIsInThisList(listId, swimlaneId) {
const currentCard = Cards.findOne(Session.get('currentCard'));
const currentCard = Utils.getCurrentCard();
const currentUser = Meteor.user();
if (
currentUser &&
@@ -95,22 +95,11 @@ function initSortable(boardComponent, $listsDom) {
//}
boardComponent.autorun(() => {
let showDesktopDragHandles = false;
currentUser = Meteor.user();
if (currentUser) {
showDesktopDragHandles = (currentUser.profile || {})
.showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
showDesktopDragHandles = true;
} else {
showDesktopDragHandles = false;
}
if (Utils.isMiniScreen() || showDesktopDragHandles) {
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
$listsDom.sortable({
handle: '.js-list-handle',
});
} else if (!Utils.isMiniScreen() && !showDesktopDragHandles) {
} else {
$listsDom.sortable({
handle: '.js-list-header',
});
@@ -123,7 +112,7 @@ function initSortable(boardComponent, $listsDom) {
'disabled',
// Disable drag-dropping when user is not member/is worker
//!userIsMember() || Meteor.user().isWorker(),
!Meteor.user().isBoardAdmin(),
!Meteor.user() || !Meteor.user().isBoardAdmin(),
// Not disable drag-dropping while in multi-selection mode
// MultiSelection.isActive() || !userIsMember(),
);
@@ -136,7 +125,7 @@ BlazeComponent.extendComponent({
const boardComponent = this.parentComponent();
const $listsDom = this.$('.js-lists');
if (!Session.get('currentCard')) {
if (!Utils.getCurrentCardId()) {
boardComponent.scrollLeft();
}
@@ -148,19 +137,38 @@ BlazeComponent.extendComponent({
this._isDragging = false;
this._lastDragPositionX = 0;
},
id() {
return this._id;
},
currentCardIsInThisList(listId, swimlaneId) {
return currentCardIsInThisList(listId, swimlaneId);
},
currentListIsInThisSwimlane(swimlaneId) {
return currentListIsInThisSwimlane(swimlaneId);
},
visible(list) {
if (list.archived) {
// Show archived list only when filter archive is on or archive is selected
if (!(Filter.archive.isSelected() || archivedRequested)) {
return false;
}
}
if (Filter.lists._isActive()) {
if (!list.title.match(Filter.lists.getRegexSelector())) {
return false;
}
}
if (Filter.hideEmpty.isSelected()) {
const swimlaneId = this.parentComponent()
.parentComponent()
.data()._id;
const cards = list.cards(swimlaneId);
if (cards.count() === 0) {
return false;
}
}
return true;
},
events() {
return [
{
@@ -172,19 +180,8 @@ BlazeComponent.extendComponent({
// the user will legitimately expect to be able to select some text with
// his mouse.
let showDesktopDragHandles = false;
currentUser = Meteor.user();
if (currentUser) {
showDesktopDragHandles = (currentUser.profile || {})
.showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
showDesktopDragHandles = true;
} else {
showDesktopDragHandles = false;
}
const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
Utils.isMiniScreen() || showDesktopDragHandles
Utils.isMiniScreenOrShowDesktopDragHandles()
? ['.js-list-handle', '.js-swimlane-header-handle']
: ['.js-list-header'],
);
@@ -264,16 +261,6 @@ BlazeComponent.extendComponent({
}).register('addListForm');
Template.swimlane.helpers({
showDesktopDragHandles() {
currentUser = Meteor.user();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
}
},
canSeeAddList() {
return Meteor.user().isBoardAdmin();
/*
@@ -316,7 +303,7 @@ BlazeComponent.extendComponent({
const boardComponent = this.parentComponent();
const $listsDom = this.$('.js-lists');
if (!Session.get('currentCard')) {
if (!Utils.getCurrentCardId()) {
boardComponent.scrollLeft();
}
@@ -359,7 +346,7 @@ class MoveSwimlaneComponent extends BlazeComponent {
boardId = bSelect.options[bSelect.selectedIndex].value;
Meteor.call(this.serverMethod, this.currentSwimlane._id, boardId);
}
Popup.close();
Popup.back();
},
},
];
+6 -2
View File
@@ -32,7 +32,9 @@ template(name="boardOrgRow")
td
if currentUser.isBoardAdmin
a.member.orgOrTeamMember.add-member.js-manage-board-removeOrg(title="{{_ 'remove-from-board'}}")
i.fa.fa-minus
i.removeTeamFaMinus.fa.fa-minus
.divaddfaplusminus
| {{_ 'remove-btn'}}
template(name="boardTeamRow")
tr
@@ -43,7 +45,9 @@ template(name="boardTeamRow")
td
if currentUser.isBoardAdmin
a.member.orgOrTeamMember.add-member.js-manage-board-removeTeam(title="{{_ 'remove-from-board'}}")
i.fa.fa-minus
i.removeTeamFaMinus.fa.fa-minus
.divaddfaplusminus
| {{_ 'remove-btn'}}
template(name="boardOrgName")
svg.avatar.avatar-initials(viewBox="0 0 {{orgViewPortWidth}} 15")
+2 -2
View File
@@ -274,7 +274,7 @@ Template.cardMembersPopup.helpers({
Template.cardMembersPopup.events({
'click .js-select-member'(event) {
const card = Cards.findOne(Session.get('currentCard'));
const card = Utils.getCurrentCard();
const memberId = this.userId;
card.toggleMember(memberId);
event.preventDefault();
@@ -290,7 +290,7 @@ Template.cardMemberPopup.helpers({
Template.cardMemberPopup.events({
'click .js-remove-member'() {
Cards.findOne(this.cardId).unassignMember(this.userId);
Popup.close();
Popup.back();
},
'click .js-edit-profile': Popup.open('editProfile'),
});
+40 -9
View File
@@ -49,10 +49,16 @@ template(name="memberMenuPopup")
i.fa.fa-lock
| {{_ 'admin-panel'}}
hr
li
a.js-edit-profile
i.fa.fa-user
| {{_ 'edit-profile'}}
if isSameDomainNameSettingValue
li
a.js-invite-people
i.fa.fa-envelope
| {{_ 'invite-people'}}
if isNotOAuth2AuthenticationMethod
li
a.js-edit-profile
i.fa.fa-user
| {{_ 'edit-profile'}}
li
a.js-change-settings
i.fa.fa-cog
@@ -62,10 +68,11 @@ template(name="memberMenuPopup")
i.fa.fa-picture-o
| {{_ 'edit-avatar'}}
unless isSandstorm
li
a.js-change-password
i.fa.fa-key
| {{_ 'changePasswordPopup-title'}}
if isNotOAuth2AuthenticationMethod
li
a.js-change-password
i.fa.fa-key
| {{_ 'changePasswordPopup-title'}}
li
a.js-change-language
i.fa.fa-flag
@@ -78,6 +85,30 @@ template(name="memberMenuPopup")
i.fa.fa-sign-out
| {{_ 'log-out'}}
template(name="invitePeoplePopup")
ul#registration-setting.setting-detail
li
#invite-people-infos
li
br
li
.invite-people(class="{{#if currentSetting.disableRegistration}}{{else}}hide{{/if}}")
ul
li
.title {{_ 'invite-people'}}
textarea#email-to-invite.wekan-form-control(rows='5', placeholder="{{_ 'email-addresses'}}")
li
.title {{_ 'to-boards'}}
.bg-white
each boards
a.option.flex.js-toggle-board-choose(id= _id)
.materialCheckBox(data-id= _id)
span= title
li
button.js-email-invite.primary {{_ 'invite'}}
template(name="editProfilePopup")
form
label
@@ -132,7 +163,7 @@ template(name="changeSettingsPopup")
a.js-toggle-desktop-drag-handles
i.fa.fa-arrows
| {{_ 'show-desktop-drag-handles'}}
if showDesktopDragHandles
if isShowDesktopDragHandles
i.fa.fa-check
unless currentUser.isWorker
li
+101 -14
View File
@@ -3,6 +3,12 @@ Template.headerUserBar.events({
'click .js-change-avatar': Popup.open('changeAvatar'),
});
BlazeComponent.extendComponent({
onCreated() {
Meteor.subscribe('setting');
},
}).register('memberMenuPopup');
Template.memberMenuPopup.helpers({
templatesBoardId() {
currentUser = Meteor.user();
@@ -22,18 +28,47 @@ Template.memberMenuPopup.helpers({
return false;
}
},
isSameDomainNameSettingValue(){
const currSett = Settings.findOne();
if(currSett && currSett != undefined && currSett.disableRegistration && currSett.mailDomainName !== undefined && currSett.mailDomainName != ""){
currentUser = Meteor.user();
if (currentUser) {
let found = false;
for(let i = 0; i < currentUser.emails.length; i++) {
if(currentUser.emails[i].address.endsWith(currSett.mailDomainName)){
found = true;
break;
}
}
return found;
} else {
return true;
}
}
else
return false;
},
isNotOAuth2AuthenticationMethod(){
currentUser = Meteor.user();
if (currentUser) {
return currentUser.authenticationMethod.toLowerCase() != 'oauth2';
} else {
return true;
}
}
});
Template.memberMenuPopup.events({
'click .js-my-cards'() {
Popup.close();
Popup.back();
},
'click .js-due-cards'() {
Popup.close();
Popup.back();
},
'click .js-open-archived-board'() {
Modal.open('archivedBoards');
},
'click .js-invite-people': Popup.open('invitePeople'),
'click .js-edit-profile': Popup.open('editProfile'),
'click .js-change-settings': Popup.open('changeSettings'),
'click .js-change-avatar': Popup.open('changeAvatar'),
@@ -45,7 +80,67 @@ Template.memberMenuPopup.events({
AccountsTemplates.logout();
},
'click .js-go-setting'() {
Popup.close();
Popup.back();
},
});
BlazeComponent.extendComponent({
onCreated() {
Meteor.subscribe('setting');
},
}).register('editProfilePopup');
Template.invitePeoplePopup.events({
'click a.js-toggle-board-choose'(event){
let target = $(event.target);
if (!target.hasClass('js-toggle-board-choose')) {
target = target.parent();
}
const checkboxId = target.attr('id');
$(`#${checkboxId} .materialCheckBox`).toggleClass('is-checked');
$(`#${checkboxId}`).toggleClass('is-checked');
},
'click button.js-email-invite'(event){
const emails = $('#email-to-invite')
.val()
.toLowerCase()
.trim()
.split('\n')
.join(',')
.split(',');
const boardsToInvite = [];
$('.js-toggle-board-choose .materialCheckBox.is-checked').each(function() {
boardsToInvite.push($(this).data('id'));
});
const validEmails = [];
emails.forEach(email => {
if (email && SimpleSchema.RegEx.Email.test(email.trim())) {
validEmails.push(email.trim());
}
});
if (validEmails.length) {
Meteor.call('sendInvitation', validEmails, boardsToInvite, (_, rc) => {
if (rc == 0) {
let divInfos = document.getElementById("invite-people-infos");
if(divInfos && divInfos !== undefined){
divInfos.innerHTML = "<span style='color: green'>" + TAPi18n.__('invite-people-success') + "</span>";
}
}
else{
let divInfos = document.getElementById("invite-people-infos");
if(divInfos && divInfos !== undefined){
divInfos.innerHTML = "<span style='color: red'>" + TAPi18n.__('invite-people-error') + "</span>";
}
}
// Popup.close();
});
}
},
});
Template.invitePeoplePopup.helpers({
currentSetting() {
return Settings.findOne();
},
});
@@ -147,7 +242,7 @@ Template.editProfilePopup.events({
} else Popup.back();
},
'click #deleteButton': Popup.afterConfirm('userDelete', function() {
Popup.close();
Popup.back();
Users.remove(Meteor.userId());
AccountsTemplates.logout();
}),
@@ -180,6 +275,8 @@ Template.changeLanguagePopup.helpers({
name = 'Français (Belgique)';
} else if (lang.name === 'fr-CA') {
name = 'Français (Canada)';
} else if (lang.name === 'fr-CH') {
name = 'Français (Schweiz)';
} else if (lang.name === 'ig') {
name = 'Igbo';
} else if (lang.name === 'lv') {
@@ -249,16 +346,6 @@ Template.changeLanguagePopup.events({
});
Template.changeSettingsPopup.helpers({
showDesktopDragHandles() {
currentUser = Meteor.user();
if (currentUser) {
return (currentUser.profile || {}).showDesktopDragHandles;
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
return true;
} else {
return false;
}
},
hiddenSystemMessages() {
currentUser = Meteor.user();
if (currentUser) {
+2 -6
View File
@@ -8,12 +8,8 @@ Blaze.registerHelper('currentBoard', () => {
});
Blaze.registerHelper('currentCard', () => {
const cardId = Session.get('currentCard');
if (cardId) {
return Cards.findOne(cardId);
} else {
return null;
}
const ret = Utils.getCurrentCard();
return ret;
});
Blaze.registerHelper('currentList', () => {
+3 -3
View File
@@ -33,11 +33,11 @@ export class CardSearchPagedComponent extends BlazeComponent {
that.hasResults.set(false);
that.serverError.set(true);
// eslint-disable-next-line no-console
console.log('Error.reason:', error.reason);
//console.log('Error.reason:', error.reason);
// eslint-disable-next-line no-console
console.log('Error.message:', error.message);
//console.log('Error.message:', error.message);
// eslint-disable-next-line no-console
console.log('Error.stack:', error.stack);
//console.log('Error.stack:', error.stack);
},
};
}
+3 -2
View File
@@ -34,6 +34,7 @@ export class DatePicker extends BlazeComponent {
todayBtn: 'linked',
language: TAPi18n.getLanguage(),
weekStart: this.startDayOfWeek(),
calendarWeeks: true,
})
.on(
'changeDate',
@@ -119,7 +120,7 @@ export class DatePicker extends BlazeComponent {
}
if (newCompleteDate.isValid()) {
this._storeDate(newCompleteDate.toDate());
Popup.close();
Popup.back();
} else if (!this.error) {
this.error.set('invalid');
}
@@ -127,7 +128,7 @@ export class DatePicker extends BlazeComponent {
'click .js-delete-date'(evt) {
evt.preventDefault();
this._deleteDate();
Popup.close();
Popup.back();
},
},
];
+1 -1
View File
@@ -187,7 +187,7 @@ window.ExportHtml = Popup => {
const boardSlug = getBoardSlug();
await addJsonExportToZip(zip, boardSlug);
Popup.close();
Popup.back();
closeSidebar();
cleanBoardHtml();
+53 -5
View File
@@ -155,6 +155,39 @@ class DateFilter {
}
}
class StringFilter {
constructor() {
this._dep = new Tracker.Dependency();
this.subField = ''; // Prevent name mangling in Filter
this._filter = '';
}
set(str) {
this._filter = str;
this._dep.changed();
}
reset() {
this._filter = '';
this._dep.changed();
}
_isActive() {
this._dep.depend();
return this._filter !== '';
}
_getMongoSelector() {
this._dep.depend();
return {$regex : this._filter, $options: 'i'};
}
_getEmptySelector() {
this._dep.depend();
return {$regex : this._filter, $options: 'i'};
}
}
// Use a "set" filter for a field that is a set of documents uniquely
// identified. For instance `{ labels: ['labelA', 'labelC', 'labelD'] }`.
// use "subField" for searching inside object Fields.
@@ -611,6 +644,7 @@ Filter = {
archive: new SetFilter(),
hideEmpty: new SetFilter(),
dueAt: new DateFilter(),
title: new StringFilter(),
customFields: new SetFilter('_id'),
advanced: new AdvancedFilter(),
lists: new AdvancedFilter(), // we need the ability to filter list by name as well
@@ -622,6 +656,7 @@ Filter = {
'archive',
'hideEmpty',
'dueAt',
'title',
'customFields',
],
@@ -647,9 +682,11 @@ Filter = {
const filterSelector = {};
const emptySelector = {};
let includeEmptySelectors = false;
let isFilterActive = false; // we don't want there is only Filter.lists
this._fields.forEach(fieldName => {
const filter = this[fieldName];
if (filter._isActive()) {
isFilterActive = true;
if (filter.subField !== '') {
filterSelector[
`${fieldName}.${filter.subField}`
@@ -680,12 +717,23 @@ Filter = {
)
selectors.push(filterSelector);
if (includeEmptySelectors) selectors.push(emptySelector);
if (this.advanced._isActive())
if (this.advanced._isActive()) {
isFilterActive = true;
selectors.push(this.advanced._getMongoSelector());
return {
$or: selectors,
};
}
if(isFilterActive) {
return {
$or: selectors,
};
}
else {
// we don't want there is only Filter.lists
// otherwise no card will be displayed ...
// selectors = [exceptionsSelector];
// will return [{"_id":{"$in":[]}}]
return {};
}
},
mongoSelector(additionalSelector) {
Loaded 100 of 303 files, more files were not shown because too many files have changed in this diff. Show more