Compare commits

...
1670 Commits
Author SHA1 Message Date
Lauri Ojansivu 83848dbee2 v0.78 2018-03-17 09:34:57 +02:00
Lauri Ojansivu cb099d1093 "DANGER" data loss warning to bigger text. 2018-03-17 09:20:12 +02:00
Lauri Ojansivu 89a8a6f5e3 - Fix scroll board when opening cardDetails
- Fix swimlane info not displayed in activities
- Fix sandstorm default swimlane creation
- Extend lists to bottom of frame in lists view
- Fix drag and drop issues when re-enter board

Thanks to andresmanelli !

Closes #1529, closes #1530, closes #1506, closes #1494, closes #1538, closes #1528
2018-03-17 09:18:31 +02:00
Lauri Ojansivu 22923d08af Enabled import at Sandtorm. Keep there warning about possible data loss bug. 2018-03-17 08:49:22 +02:00
Lauri Ojansivu 57ccfcde63 Update translations. 2018-03-17 08:48:55 +02:00
Lauri Ojansivu 75693d16e2 Add language: Armenian. 2018-03-17 08:48:30 +02:00
Andrés Manelli 454523dd47 Fix scroll board when opening cardDetails 2018-03-17 00:31:19 -03:00
Andrés Manelli bb37d8fa96 Fix swimlane info not displayed in activities 2018-03-16 23:31:24 -03:00
Andrés Manelli f470323ee7 Fix sandstorm default swimlane creation 2018-03-16 23:18:26 -03:00
Andrés Manelli c62a2ee11f Extend lists to bottom of frame in lists view 2018-03-16 22:37:08 -03:00
Andrés Manelli 5b0f7f8aef Fix drag and drop issues when re-enter board 2018-03-16 22:13:40 -03:00
Lauri Ojansivu 0495e61c28 Change snap to previous MongoDB version 3.2.18 because of data loss:
https://github.com/wekan/wekan-mongodb/issues/9
2018-03-15 18:54:03 +02:00
Lauri Ojansivu c1c3421006 Change to previous MongoDB version 3.2.18 because of data loss:
https://github.com/wekan/wekan-mongodb/issues/9
2018-03-15 18:53:28 +02:00
Lauri Ojansivu 3ce90e9766 Update translations. 2018-03-13 02:01:52 +02:00
Lauri Ojansivu 293718d90c - Fix card copy and move with swimlanes
Thanks andresmanelli ! Closes #1520
2018-03-07 21:18:08 +02:00
Andrés Manelli 4b53b0c90a Fix card copy and move with swimlanes 2018-03-07 14:11:21 -03:00
Lauri Ojansivu 98103bb2f7 Merge branch 'lumatijev-patch-1' into devel 2018-03-07 15:33:09 +02:00
Lauri Ojansivu e5b003f5ab - Fix swimlane header rotation on Google Chrome. After this change
both Firefox 58 and Google Chrome 64 have properly rotated
  swimlane header.

Thanks to lumatijev !
2018-03-07 15:31:34 +02:00
Luka Matijević 9a1b1a5bed Fix swimlane header rotation on Google Chrome
After this change both Firefox 58 and Google Chrome 64 have properly rotated swimlane header.
2018-03-07 09:42:35 +01:00
Lauri Ojansivu 990af4e5c2 Update translations. 2018-03-07 09:05:10 +02:00
Lauri Ojansivu f7a9bafe4c - Fix scroll when dragging elements. Remove
scrollbars from swimlanes.
- Partial fix for scroll bar inside cardDetails.

Thanks to andresmanelli !

Closes #1458, closes #1484,
closes #1481, closes #1497,
closes #1521
2018-03-07 08:13:35 +02:00
Andrés Manelli ac7d44f8a8 Partial fix for scroll bar inside cardDetails 2018-03-06 22:00:13 -03:00
Andrés Manelli ed8471be9b Fix scroll when dragging elements. Remove scrollbars from swimlanes. 2018-03-06 21:36:16 -03:00
Lauri Ojansivu 65beb89944 MongoDB 3.2.19 2018-03-06 01:08:56 +02:00
Lauri Ojansivu 663d8e3c34 Fix Scrollbar near top of screen when using internet explorer on Win7.
Thanks to lunatic4ever ! Closes #1524
2018-03-05 23:05:02 +02:00
Lauri Ojansivu 128a356b92 - Fix Scrollbar near top of screen when using internet explorer on Win7
Thanks to lunatic4ever ! Closes #1524
2018-03-05 23:01:09 +02:00
Lauri Ojansivu 2092b429db - Fix Add Card Button dissapearing when dragging
Thanks to andresmanelli ! Closes #1519
2018-03-05 22:43:02 +02:00
Andrés Manelli 58e5e9b308 Fix #1519 Add Card Btn dissapear on drag 2018-03-05 17:25:00 -03:00
Lauri Ojansivu 338fb5304d Update translations. 2018-03-03 17:46:49 +02:00
Lauri Ojansivu 9e62584b26 Merge branch 'GhassenRjab-feature/list-default-view' into devel 2018-03-02 12:47:17 +02:00
Lauri Ojansivu 5849ffbb53 - Lists view is the default view when creating boards.
Thanks to GhassenRjab ! Closes #1507
2018-03-02 12:45:20 +02:00
Lauri Ojansivu a58bffbb3e Merge branch 'feature/list-default-view' of https://github.com/GhassenRjab/wekan into GhassenRjab-feature/list-default-view 2018-03-02 12:39:10 +02:00
Lauri Ojansivu a8ae6adbc2 Merge branch 'GhassenRjab-hotfix/wekan-import' into devel 2018-03-02 12:38:02 +02:00
Lauri Ojansivu 946dcf0b0a - Import missing card fields: isOvertime, startAt and spentTime.
Thanks to GhassenRjab ! Closes #1516, closes #1428
2018-03-02 12:36:30 +02:00
Ghassen Rjab 1ca9e96f35 Lists view is the default view when creating boards 2018-03-02 00:06:45 +01:00
Ghassen Rjab b475127c53 Import missing card fields : isOvertime, startAt and spenTime 2018-03-01 23:34:17 +01:00
Lauri Ojansivu bbca361aeb Merge branch 'kubiko-devel' into devel 2018-03-01 14:37:31 +02:00
Lauri Ojansivu f96e21f462 Snap:
- Adding network hooks for configure hook to fix security denials
- Fixing problem when mongodb was not started at install/refresh

Thanks to kubiko ! Closes wekan/wekan-snap#36
2018-03-01 14:13:47 +02:00
Ondrej Kubik 1be8e5625f Fixing problem when mongodb was not started at install/refresh
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-03-01 11:53:40 +00:00
Ondrej Kubik 9084158aec Adding network hooks for configure hook to fix security denials
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-03-01 11:53:21 +00:00
Lauri Ojansivu d454fa7dd7 - Remove list max-height 350px.
Thanks to xet7 !
Closes #1512, closes wekan/wekan-snap#35
2018-03-01 13:00:48 +02:00
Lauri Ojansivu b6d3e79548 Remove list max-height 350px. Thanks to xet7 !
Closes #1512, closes wekan/wekan-snap#35
2018-03-01 12:54:28 +02:00
Lauri Ojansivu a23d93391b - Fix scrollbar inside list and outer scroll.
Thanks to andresmanelli ! Closes #1485
2018-03-01 01:02:09 +02:00
Andrés Manelli a033c35a34 Fix scrollbar inside list and outer scroll 2018-02-28 15:48:36 -03:00
Lauri Ojansivu 48cd551a69 Merge remote-tracking branch 'upstream/devel' into devel 2018-02-28 16:36:46 +02:00
Andrés Manelli 8d2839f0c3 Fix order lists in lists view 2018-02-28 11:24:39 -03:00
Lauri Ojansivu 284fac043b - Allow swimlanes reordering
- Avoid swimlane title overlap

Thanks to andresmanelli !
Related #955. Closes #1487
2018-02-28 10:30:05 +02:00
Lauri Ojansivu bd239351fd Update translations. 2018-02-28 09:07:42 +02:00
Andrés Manelli 37c94622e4 Allow swimlanes reordering 2018-02-27 20:11:43 -03:00
Andrés Manelli c4fa9010f3 Avoid swimlane title overlap 2018-02-27 13:51:47 -03:00
Lauri Ojansivu 843381a36c Merge pull request #1510 from GhassenRjab/feature/fix-lint-warnings
Fix lint warnings
2018-02-27 08:41:35 +02:00
Ghassen Rjab 59ba2111e8 Fix lint warnings 2018-02-27 02:57:58 +01:00
Lauri Ojansivu 1efa66b58c Merge branch 'GhassenRjab-feature/fix-lint' into devel 2018-02-26 16:11:03 +02:00
Lauri Ojansivu dc8c9053c2 - Fix lint errors related to sandstorm
- Add Swimlanes to globals
- Fix lint errors related to trello creator
- Fix lint errors related to language names

Thanks to GhassenRjab !
2018-02-26 16:10:18 +02:00
Ghassen Rjab 0a16147470 Fix lint errors related to sandstorm 2018-02-26 03:19:59 +01:00
Ghassen Rjab 373e9782dc Add Swimlanes to globals 2018-02-26 03:19:27 +01:00
Ghassen Rjab 951a0db380 Fix lint errors related to trello creator 2018-02-26 03:18:26 +01:00
Ghassen Rjab c0d33d97f2 Fix lint errors related to language names 2018-02-26 03:17:56 +01:00
Lauri Ojansivu 5bdb392258 v0.77 2018-02-23 21:00:09 +02:00
Lauri Ojansivu a48630ffcf Merge branch 'GhassenRjab-feature/search' into devel 2018-02-23 20:40:48 +02:00
Lauri Ojansivu fe1941008c Update translations. 2018-02-23 20:36:46 +02:00
Lauri Ojansivu 190aa36a51 Add Bulgarian language. 2018-02-23 19:42:13 +02:00
Lauri Ojansivu 468f4de0cf Search from card titles and descriptions on this board.
Thanks to GhassenRjab ! Closes #552
2018-02-23 19:17:52 +02:00
Lauri Ojansivu 93215be2cf Better descriptions about search. 2018-02-23 19:08:21 +02:00
Ghassen Rjab ab2884cae0 Fix lint error related to this feature 2018-02-23 01:38:12 +01:00
Ghassen Rjab 5f374b2fd2 Open search sidebar from an opened board 2018-02-23 01:10:21 +01:00
Ghassen Rjab 636e1657f6 Add search sidebar 2018-02-23 01:09:59 +01:00
Ghassen Rjab 2001c01b4d Add search cards helper to boards model 2018-02-23 01:09:25 +01:00
Lauri Ojansivu a9166d877f Snap specific updates:
- Service life cycle improvements
- Wekan help text changes and tweaks

https://github.com/wekan/wekan/pull/1495

Thanks to kubiko !
2018-02-23 00:27:55 +02:00
Lauri Ojansivu 435501fb8e Merge pull request #1500 from kubiko/devel
service life cycle improvements
2018-02-22 21:50:41 +02:00
Ondrej Kubik fd47e10e52 Tuning services life cycle
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-22 13:14:03 +00:00
Ondrej Kubik e3bd1c4d23 Adding mongodb service control to configure hook
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-22 11:48:33 +00:00
Ondrej Kubik f7b72a1a80 Fixing typo and improving help text
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-22 11:48:33 +00:00
Lauri Ojansivu 31f25bcddb Merge branch 'stefano-pogliani-card-shadow' into devel 2018-02-22 02:24:43 +02:00
Lauri Ojansivu 1ec5e90706 Fix card shadow to cover the full page.
Thanks to stefano-pogliani !
2018-02-22 02:23:34 +02:00
Lauri Ojansivu 20d6ea85d4 Merge branch 'card-shadow' of https://github.com/stefano-pogliani/wekan into stefano-pogliani-card-shadow 2018-02-22 02:19:20 +02:00
Lauri Ojansivu 7498dba32c Merge branch 'kubiko-devel' into devel 2018-02-22 02:17:52 +02:00
Lauri Ojansivu d374cd2f81 Snap updates:
- cleanup of snap helper scripts
- cleanup and snapctl settings handling
- fix for snap store auto review refusal
- adding support for automatic restart of services when setting(s) are changed.
  No need to call systemctl restart anymore.....
- fixing snap set functionality
- adding optional caddy service support ( by default caddy service is disabled),
  it can be enabled by calling: snap set wekan caddy-enabled=true

Thanks to kubiko !

Closes wekan/wekan-snap#25, closes wekan/wekan-snap#12,
closes wekan/wekan-snap#29, closes wekan/wekan-snap#33
2018-02-22 02:09:05 +02:00
Stefano Pogliani ffbd3ccc2a Fix card shadow to cover the full page. 2018-02-21 22:54:15 +00:00
Ondrej Kubik ad1a181f6d Fixing wrong port number shown in wekan.help
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:26 +00:00
Ondrej Kubik fcd83ea7bd Fixing automatic review fail for snap store upload
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:25 +00:00
Ondrej Kubik 07fc296762 Cleaning snapctl usage
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:25 +00:00
Ondrej Kubik 62fca18fea Updating gitignore
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:25 +00:00
Ondrej Kubik af82a80b2b Using upstream caddy instead of compiling from source
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:25 +00:00
Ondrej Kubik 9966c19f94 Fixing wrong caddy file path
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:24 +00:00
Ondrej Kubik ff320f7b3a enabling verbose logging from configure hook
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:24 +00:00
Ondrej Kubik 9c9694bcd1 Fixing snapctl start/stop to control service lifecycle
Adding disable and enable options for snapctl start/stop

Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:24 +00:00
Ondrej Kubik fcd7097aba Renaming caddy service for simplicity
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:24 +00:00
Ondrej Kubik 19089e8930 rewording helper script output
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Ondrej Kubik f7920da0cf fixing go build error because of go version used on build server
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Ondrej Kubik d7ea73ff82 adding uspport for snapctl restart
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Ondrej Kubik e077c85d00 Adding caddy support
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Ondrej Kubik 3665a9131c splitting hooks and using snapctl instead of local settings file
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Ondrej Kubik f7fe44fcdf removing unused variables
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Ondrej Kubik a533caa944 rearranging helper scripts in snap-src
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-21 22:29:23 +00:00
Lauri Ojansivu 26f66f3cf0 v0.76 2018-02-21 21:03:29 +02:00
Lauri Ojansivu 2e449e9e78 Update translations. 2018-02-21 20:49:33 +02:00
Lauri Ojansivu e30f6515c6 Disabled Import temporarily on Sandstorm because of data loss bug.
Thanks to xet7 !
2018-02-21 20:20:19 +02:00
Lauri Ojansivu 11e9811f82 Added path to capnp.js to make Wekan work on Sandstorm. 2018-02-21 20:15:40 +02:00
Lauri Ojansivu df5be82840 Update translations. 2018-02-20 15:09:34 +02:00
Lauri Ojansivu 599c83e0da Persian (Iran) => Persian 2018-02-20 14:43:04 +02:00
Lauri Ojansivu c0dbb79ac9 Merge branch 'couscous3-patch-1' into devel 2018-02-20 14:22:38 +02:00
Lauri Ojansivu 0375c551f3 Add swimlaneId to API. Thanks to couscous3 ! 2018-02-20 14:21:34 +02:00
couscous3 ee0f42eeb1 add swimlaneId to POST /api/boards/:boardId/lists/:listId/cards route 2018-02-19 14:55:56 +01:00
Lauri Ojansivu 7f4b382d2f Merge branch 'erikturk-copyMany' into devel
v0.75
2018-02-16 00:08:29 +02:00
Lauri Ojansivu 96d81768bc v0.75 2018-02-16 00:06:00 +02:00
Lauri Ojansivu cd012954e9 Adding Finnish changelog to Sandstorm. 2018-02-15 23:47:55 +02:00
Lauri Ojansivu 3b202c284a Update translations. 2018-02-15 23:41:04 +02:00
Lauri Ojansivu 8da1dd524d Merge branch 'copyMany' of https://github.com/erikturk/wekan into erikturk-copyMany 2018-02-15 22:40:59 +02:00
Erik Turk cfaeb43f1f changed variable names 2018-02-15 15:26:19 -05:00
Erik Turk 25e0c38ad8 change copyMany to copyChecklistToManyCards for instructions and title 2018-02-15 11:55:15 -05:00
Erik Turk 756fbd0f4c i18n fixes 2018-02-14 15:18:54 -05:00
Lauri Ojansivu 55a53e2655 Add note about Unicode Emojis. 2018-02-13 00:17:57 +02:00
Lauri Ojansivu 29461cb110 v0.74 2018-02-13 00:06:20 +02:00
Lauri Ojansivu a30f61d72f Remove Emoji support, so MAC addresses etc show correctly.
Thanks to xet7 ! Closes #1248, closes #323
2018-02-12 23:58:09 +02:00
Lauri Ojansivu 056843d66c Remove Emoji support, so MAC addresses etc show correctly.
Thanks to xet7 ! Closes #1248, closes #323
2018-02-12 23:52:22 +02:00
Lauri Ojansivu 69e4ad48bf Update translations. 2018-02-12 22:40:08 +02:00
Lauri Ojansivu 3588f4324c License year to 2018 2018-02-12 21:08:11 +02:00
Lauri Ojansivu 71decc370d Update screenshot. 2018-02-12 20:52:11 +02:00
Lauri Ojansivu 3171af613a Add Quay. Comment out Travis. 2018-02-12 20:49:08 +02:00
Erik Turk 11b8e12ede spaces/tabs okay - no 'git add i18n/en-GB.i18n.json' 2018-02-08 13:11:20 -05:00
Erik Turk 69aeee536d Merge branch 'devel' into copyMany 2018-02-08 13:04:43 -05:00
Erik Turk ab6a7c2dd6 Merge branch 'devel' of https://github.com/wekan/wekan into devel 2018-02-08 13:03:37 -05:00
Erik Turk 0a5af2b719 more spacing/tabs fixes 2018-02-08 10:32:09 -05:00
Erik Turk ecd77c8704 fixed spacing & indentation - changed var to const 2018-02-08 10:13:54 -05:00
Erik Turk c5019e620a remove console.log statements 2018-02-08 08:14:33 -05:00
Erik Turk 257ed56db3 finish adding[4~ copyMany 2018-02-08 08:13:31 -05:00
Lauri Ojansivu edc2459ff8 v0.73 2018-02-08 13:45:09 +02:00
Lauri Ojansivu 36a2aa355e Merge branch 'kubiko-devel-fix' into devel
Fix snap store rejection. Thanks to kubiko !
Closes wekan/wekan-snap#20,
closes wekan/wekan-snap#28,
closes wekan/wekan-snap#27,
closes wekan/wekan-snap#24
2018-02-08 13:43:01 +02:00
Lauri Ojansivu cea8101574 Fix snap store rejection. Thanks to kubiko !
Closes wekan/wekan-snap#20,
closes wekan/wekan-snap#27,
closes wekan/wekan-snap#24
2018-02-08 13:35:40 +02:00
Ondrej Kubik 3cb356eb1d Fixing snap store rejection
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2018-02-08 11:03:58 +00:00
Lauri Ojansivu b3d3158863 v0.72 2018-02-07 15:37:02 +02:00
Lauri Ojansivu f795edc640 Fix import Trello board without swimlanes. Fix swimlane move parameters.
Thanks to andresmanelli ! Closes #1442
2018-02-07 15:33:29 +02:00
Lauri Ojansivu c1ddaaa475 Merge remote-tracking branch 'upstream/devel' into devel 2018-02-07 15:24:22 +02:00
Lauri Ojansivu 2dc71e97a7 Merge branch 'ViViDboarder-fix-card-sorting' into devel 2018-02-07 15:23:33 +02:00
Lauri Ojansivu 92122f0fa2 Fix card sorting. Thanks to ViViDboarder ! Closes #1461 2018-02-07 15:21:02 +02:00
Lauri Ojansivu ce1fd00517 Update translations. 2018-02-07 15:17:40 +02:00
Andrés Manelli 5871a478e1 Fix import Trello board without swimlanes 2018-02-07 01:47:18 -03:00
Andrés Manelli fcebb2a537 Fix move parameters 2018-02-07 01:24:15 -03:00
ViViDboarder b267015d8c Fixing cards query to apply sort
Issue #1461
2018-02-06 19:35:01 -08:00
Erik Turk 842c8b83d2 missing ) 2018-02-05 15:03:21 -05:00
Erik Turk 9705118ca2 add titleList.split to copyManyCard 2018-02-05 14:47:37 -05:00
Erik Turk 326b4c5350 added copyManyCard 2018-02-05 13:27:47 -05:00
Erik Turk f3ed6ee6f6 added copyManyCardPopup to i18n 2018-02-05 13:26:26 -05:00
Erik Turk 60c6f4f5af added Popup 2018-02-05 11:11:41 -05:00
Erik Turk 3c1cd85f6f added copyManyCard 2018-02-05 11:02:01 -05:00
Erik Turk bb9d5cb694 Revert "added copyManyCard"
This reverts commit c3fe70e094.
2018-02-05 10:58:36 -05:00
Erik Turk 669c2f3861 Revert "Revert "v0.71""
This reverts commit 6a93a93d0b.
2018-02-05 10:58:13 -05:00
Erik Turk 6a93a93d0b Revert "v0.71"
This reverts commit 79ae90825e.
2018-02-05 10:57:08 -05:00
Erik Turk c3fe70e094 added copyManyCard 2018-02-05 10:49:37 -05:00
Lauri Ojansivu 79ae90825e v0.71 2018-02-03 12:56:09 +02:00
Lauri Ojansivu b0f0bf4a24 Fix Welcome board is not editable: Added default swimlane to Welcome board.
Fix Import Wekan board with swimlanes.
Thanks to andresmanelli ! Closes #1457, closes #1445
2018-02-03 12:49:45 +02:00
Lauri Ojansivu 9dba6ff6fd Update translations. 2018-02-03 12:11:58 +02:00
Andrés Manelli d77afe3e2e Add trailing comma 2018-02-02 23:09:42 -03:00
Andrés Manelli ec0a8449ba Fix import wekan board with swimlanes 2018-02-02 23:04:54 -03:00
Andrés Manelli 9df3e3d26b Add default swimlane to welkome board 2018-02-02 21:52:00 -03:00
Lauri Ojansivu 73401a5d74 v0.70 2018-02-02 14:36:07 +02:00
Lauri Ojansivu 653f2b1ac8 Update translations. 2018-02-02 14:28:42 +02:00
Lauri Ojansivu 2cd4caa76a Add missing text to changelog. 2018-02-02 14:21:48 +02:00
Lauri Ojansivu 000b267eaf Update changelog. 2018-02-02 14:06:40 +02:00
Andrés Manelli 5953fb8a44 Add popup menu and archive action 2018-02-01 14:29:49 -03:00
Andrés Manelli 3414cb84ad Add ability to edit swimlane name 2018-02-01 14:24:21 -03:00
Andrés Manelli 42bc905c16 Remove unused hack 2018-02-01 14:24:21 -03:00
Lauri Ojansivu d94f11c778 v0.69 2018-02-01 16:47:14 +02:00
Lauri Ojansivu fcd5fda751 Merge branch 'd-Rickyy-b-patch-1' into devel 2018-02-01 16:25:27 +02:00
Lauri Ojansivu 66bfb1cdc8 Fix typo. 2018-02-01 16:24:57 +02:00
Lauri Ojansivu 69dfa1033f Fix typo in issue template. Thanks to d-Rickyy-b ! 2018-02-01 16:23:51 +02:00
Lauri Ojansivu 94b8bba324 Merge branch 'patch-1' of https://github.com/d-Rickyy-b/wekan into d-Rickyy-b-patch-1 2018-02-01 16:21:41 +02:00
Lauri Ojansivu 5dd8c9829d Update translations: Hebrew. Related #884 2018-02-01 16:20:29 +02:00
Lauri Ojansivu e0e6f06a83 Fix swimlanes card details and drag bugs. Thanks to andresmanelli ! 2018-02-01 15:59:22 +02:00
Rico 8322500e47 Fix typo in issue template 2018-01-31 23:21:07 +01:00
Andrés Manelli ff9ca755f3 Fix details view in lists only mode 2018-01-31 15:46:59 -03:00
Andrés Manelli d3c110cd8f Workaround to avoid drag bug 2018-01-31 14:13:14 -03:00
Andrés Manelli f6fb05d3f4 Fix card details bug 2018-01-31 14:13:14 -03:00
Lauri Ojansivu 8102ee5b4f Add release date to changelog. 2018-01-30 15:18:27 +02:00
Lauri Ojansivu 3c60df4fcd Update translations. 2018-01-30 15:04:55 +02:00
Lauri Ojansivu 23cba8a43f v0.68 2018-01-29 12:10:31 +02:00
Lauri Ojansivu 65c081acc0 Fix: Trello board import fails because of missing "Swimlane id".
Thanks to xet7 ! Closes #1442
2018-01-29 12:07:42 +02:00
Lauri Ojansivu 735907977d v0.67 2018-01-28 21:21:07 +02:00
Lauri Ojansivu 9d7ff75d3f Fix Igbo language at menu. 2018-01-28 21:01:22 +02:00
Lauri Ojansivu 1ef5b8efe1 Remove extra file. 2018-01-28 19:19:49 +02:00
Lauri Ojansivu f3d6aa9e09 Update translations. 2018-01-28 19:15:51 +02:00
Lauri Ojansivu fd430d3405 v0.66 2018-01-28 18:27:00 +02:00
Lauri Ojansivu 0ce4171d33 Merge branch 'soohwa-fix-dockerfile-rm' into devel
Fix Dockerfile for Debian. Thanks to soohwa !
2018-01-28 11:22:00 +02:00
Lauri Ojansivu 7df5679c0c Fix Dockerfile for Debian. Thanks to soohwa ! 2018-01-28 11:21:21 +02:00
soohwa 1616dd1b74 Fix Dockerfile 2018-01-28 10:04:10 +01:00
Lauri Ojansivu 081c1fdf83 v0.65 2018-01-28 00:01:20 +02:00
Lauri Ojansivu 9444624f19 Rename Igbo langage code name to get it working. 2018-01-27 23:25:50 +02:00
Lauri Ojansivu abd1d322f2 Try to fix Dockerfile. 2018-01-27 21:35:40 +02:00
Lauri Ojansivu d19083bb89 Update translations. 2018-01-27 18:28:31 +02:00
Lauri Ojansivu 7ddaa12520 Update translations. 2018-01-25 09:07:43 +02:00
Lauri Ojansivu 3b8c76a32e Update versions of Node and NPM at Travis. 2018-01-25 09:00:57 +02:00
Lauri Ojansivu 7f4401f3a2 Fix lint errors. Update changelog. 2018-01-25 08:22:11 +02:00
Lauri Ojansivu 188341cf50 Merge remote-tracking branch 'upstream/devel' into devel 2018-01-25 07:31:42 +02:00
Andrés Manelli af119ff7c0 Add card on first swimlane found 2018-01-22 23:43:47 -03:00
Andrés Manelli 7b04f14e3c Allow toogle of lists and swimlanes views 2018-01-22 23:35:23 -03:00
Andrés Manelli a14f4ffee2 Add view boards field to change between views 2018-01-22 16:54:19 -03:00
Andrés Manelli 2d7d9b5d9f Fix lint errors 2018-01-22 15:31:33 -03:00
Andrés Manelli ecb8c88233 Add migration for swimlane addition 2018-01-22 15:10:26 -03:00
Lauri Ojansivu 91e738bd32 Go back using debian buster-slim Docker base image 2018-01-22 18:46:53 +02:00
Lauri Ojansivu ec0bbe9e14 Try Debian experimental with Docker, does it work or fix bugs 2018-01-22 17:54:19 +02:00
Lauri Ojansivu 6e25ef73b0 Use Debian package version of gosu 2018-01-22 17:22:16 +02:00
Lauri Ojansivu d2ce41694f Dockerfile apt => apt-get 2018-01-22 17:17:28 +02:00
Lauri Ojansivu b2c9d47b0f Removed dist-upgrade from Dockerfile, trying to fix docker build. 2018-01-22 16:59:36 +02:00
Lauri Ojansivu 52aa22f36a Try Debian 10 buster with Docker 2018-01-22 16:53:39 +02:00
Lauri Ojansivu bc6217854a Try to fix snap external symlink, that prevents uploading of snap 2018-01-22 16:41:01 +02:00
Lauri Ojansivu d79bb1a81c Try to fix Docker and Snap: add apt-utils, remove sed bson. 2018-01-22 14:37:34 +02:00
Lauri Ojansivu fb220fe918 v0.64 2018-01-22 00:43:41 +02:00
Lauri Ojansivu 89ccef84be Sandstorm fix for Meteor 1.6.0.1 2018-01-22 00:20:53 +02:00
Lauri Ojansivu 6622dbb56b Meteor 1.6.0.1, Node 8.9.3, NPM 5.5.1, fibers 2.0.0 2018-01-22 00:18:59 +02:00
Lauri Ojansivu 7963171058 Update translations. 2018-01-21 18:24:16 +02:00
Andrés Manelli ee2a43dd5b Add siwmlane button. Allow card drop between swimlanes 2018-01-19 16:00:02 -03:00
Andrés Manelli 690a5b9703 First swimlane draft, no functionality 2018-01-19 12:22:03 -03:00
Lauri Ojansivu f33be3e243 Add Mongolian and Portuguese. 2018-01-16 01:54:16 +02:00
Lauri Ojansivu 4eaf92d17e Update translations. Add Mongolian and Portuguese. 2018-01-16 01:53:11 +02:00
Lauri Ojansivu 1baa4b2fa4 spenttime => spent time 2018-01-16 00:27:14 +02:00
Lauri Ojansivu 6210c00f95 Fix double slash bug on snap. Thanks to xet7 ! 2018-01-15 23:01:00 +02:00
Lauri Ojansivu 8b6a2eade3 Update translations. 2018-01-15 19:49:30 +02:00
Lauri Ojansivu f7ef629dba Merge branch 'dpoznyak-bugfix/#476-scroll-drag-lists' into devel
Fix for dragging into scrolled-down list. Thanks to dpoznyak !
Partially addresses #476
2018-01-08 18:41:27 +02:00
Lauri Ojansivu 0f0a93cabf Fix for dragging into scrolled-down list. Thanks to dpoznyak !
Partially addresses #476
2018-01-08 18:40:03 +02:00
DPLV\dpoz e5193870fc working fix for wekan/wekan#476 in lists
working fix for wekan/wekan#476 in lists
2018-01-08 23:26:09 +08:00
Lauri Ojansivu 428465d361 Try to fix double slash on snap #962 2018-01-06 20:29:16 +02:00
Lauri Ojansivu 37b2771a9d Update translations. 2018-01-06 16:29:44 +02:00
Lauri Ojansivu ccb14beb83 Merge branch 'mmarschall-different-icons-for-start-and-due-date' into devel
Different icons for start and due date. Thanks to mmarschall !
Closes #1414
2018-01-06 15:34:31 +02:00
Lauri Ojansivu 17bb464107 Different icons for start and due date. Thanks to mmarschall !
Closes #1414
2018-01-06 15:32:18 +02:00
Matthias Marschall cd4062c9f1 different icons for start and due date 2018-01-04 18:34:39 +01:00
Lauri Ojansivu 22158b4941 Update translations. 2017-12-28 22:35:21 +02:00
Lauri Ojansivu bdf252b6e2 v0.63 2017-12-20 15:18:45 +02:00
Lauri Ojansivu 2347fbae17 Update translations. 2017-12-20 14:45:31 +02:00
Lauri Ojansivu 9e3e63f494 Merge branch 'thuanpq-auto-setting-card-cover-with-drag-drop' into devel 2017-12-20 14:15:38 +02:00
Lauri Ojansivu ba2d9b89dc Auto update card cover with new image uploaded via drag&drop.
Thanks to thuanpq !
2017-12-20 14:14:46 +02:00
Lauri Ojansivu 62d000cd67 Merge branch 'auto-setting-card-cover-with-drag-drop' of https://github.com/thuanpq/wekan into thuanpq-auto-setting-card-cover-with-drag-drop 2017-12-20 14:12:52 +02:00
Lauri Ojansivu 0c15048bdd Use Node 4.6.7. Add paxctl fix to snap. 2017-12-20 14:11:41 +02:00
Lauri Ojansivu 74877fd10d Try to fix snap build. 2017-12-19 21:38:20 +02:00
Thuan Pham Quoc c3e67510c8 Update - auto update card cover with new image uploaded via drag&drop 2017-12-18 22:40:01 +07:00
Lauri Ojansivu 4fad48e7ac Revert snap MongoDB from v3.2.18 back to v3.2.16 because of SSL cert error. Trying to fix snap build. 2017-12-13 14:28:32 +02:00
Lauri Ojansivu 0f567a8e9c Trying to fix snap build. 2017-12-13 13:49:07 +02:00
Lauri Ojansivu 0d976aaf0f v0.62 2017-12-12 15:36:02 +02:00
Lauri Ojansivu f115e33f66 v0.61 2017-12-12 14:30:02 +02:00
Lauri Ojansivu 6e8a84eaa7 Restore Meteot 1.4 version of sandstorm.js 2017-12-12 14:18:34 +02:00
Lauri Ojansivu eb9d417a27 Add mixmax:smart-disconnect to lower CPU usage when
browser tab is not selected. Thanks mfshiu !
Related wekan/wekan-mongodb#2
2017-12-12 14:06:14 +02:00
Lauri Ojansivu 8dd6255ebf Revert back to Meteor v1.4, Node v4.8.6 and MongoDB v3.2.18 2017-12-12 13:58:46 +02:00
Lauri Ojansivu 7a943f99e3 Add mixmax:smart-disconnect to lower CPU usage when
browser tab is not selected. Thanks mfshiu !
Related wekan/wekan-mongodb#2
2017-12-12 13:51:45 +02:00
Lauri Ojansivu 415fafe7f6 Add mixmax:smart-disconnect to lower CPU usage when
browser tab is not selected. Thanks mfshiu !
Related wekan/wekan-mongodb#2
2017-12-12 13:50:19 +02:00
Lauri Ojansivu 462b8023eb Update translations. 2017-12-11 23:38:49 +02:00
Lauri Ojansivu 8f2bebeeef Merge branch 'thuanpq-make-small-add-card-at-list-top-easier-to-see' into devel 2017-12-11 22:54:58 +02:00
Lauri Ojansivu e08f9686d8 Make it easier to see the Add Card button at top of list.
Thanks to thuanpq !
2017-12-11 22:54:10 +02:00
Lauri Ojansivu bd127af916 Merge branch 'make-small-add-card-at-list-top-easier-to-see' of https://github.com/thuanpq/wekan into thuanpq-make-small-add-card-at-list-top-easier-to-see 2017-12-11 22:52:53 +02:00
Lauri Ojansivu d235a00b11 Merge branch 'thuanpq-keep-attachment-section-for-uploading-attachment-easier' into devel 2017-12-11 22:51:50 +02:00
Lauri Ojansivu 8dc9856ed8 Always display attachment section for uploading file quickly.
Thanks to thuanpq !
2017-12-11 22:51:16 +02:00
Lauri Ojansivu ca1da1adc2 Merge branch 'keep-attachment-section-for-uploading-attachment-easier' of https://github.com/thuanpq/wekan into thuanpq-keep-attachment-section-for-uploading-attachment-easier 2017-12-11 22:49:09 +02:00
Lauri Ojansivu 4c0b262c7b Merge branch 'thuanpq-fixed-bug-on-long-card-history-log' into devel 2017-12-11 22:47:45 +02:00
Lauri Ojansivu 4ac9048d80 Fixed bug on long url of attachment in card activity log.
Thanks to thuanpq !
2017-12-11 22:46:59 +02:00
Lauri Ojansivu fb83a5164d Merge branch 'fixed-bug-on-long-card-history-log' of https://github.com/thuanpq/wekan into thuanpq-fixed-bug-on-long-card-history-log 2017-12-11 22:45:56 +02:00
Lauri Ojansivu a05292bd91 Update Travis versions of Node and NPM. 2017-12-11 22:44:34 +02:00
Lauri Ojansivu f4e0d92296 Merge branch 'thuanpq-fix-bug-on-header-quick-access' into devel 2017-12-11 22:13:28 +02:00
Lauri Ojansivu 9e0142b885 Boards subscription should be placed at header for all other component
can be used. Thanks to thuanpq !
2017-12-11 22:12:49 +02:00
Lauri Ojansivu 5f30c6ecca Merge branch 'fix-bug-on-header-quick-access' of https://github.com/thuanpq/wekan into thuanpq-fix-bug-on-header-quick-access 2017-12-11 22:11:31 +02:00
Lauri Ojansivu 7214e4bb2f Merge branch 'thuanpq-auto-update-card-cover-with-latest-uploaded-image' into devel 2017-12-11 22:08:17 +02:00
Lauri Ojansivu fd7a140429 Auto update card cover with latest uploaded image attachment.
Thanks to thuanpq !
2017-12-11 22:07:47 +02:00
Lauri Ojansivu 07954c0f6d Merge branch 'auto-update-card-cover-with-latest-uploaded-image' of https://github.com/thuanpq/wekan into thuanpq-auto-update-card-cover-with-latest-uploaded-image 2017-12-11 22:06:14 +02:00
Lauri Ojansivu a282a38ecd Merge branch 'thuanpq-dont-open-swipebox-overlay-while-downloading-update-cover' into devel 2017-12-11 22:05:07 +02:00
Lauri Ojansivu 1f830cc5e3 Don't open swipebox on update card cover / download file / delete file.
Thanks to thuanpq !
2017-12-11 22:04:24 +02:00
Lauri Ojansivu 96b560eb00 Merge branch 'dont-open-swipebox-overlay-while-downloading-update-cover' of https://github.com/thuanpq/wekan into thuanpq-dont-open-swipebox-overlay-while-downloading-update-cover 2017-12-11 22:00:38 +02:00
Lauri Ojansivu 6ce5ea9ca5 Merge branch 'thuanpq-fix-bug-on-sidebar-member-avatar-not-shown' into devel 2017-12-11 21:51:39 +02:00
Lauri Ojansivu 9ed730284d Fixed bug on not able to see member avatar on sidebar activity.
Thanks to thuanpq !
2017-12-11 21:50:21 +02:00
Lauri Ojansivu 10427a9beb Merge branch 'fix-bug-on-sidebar-member-avatar-not-shown' of https://github.com/thuanpq/wekan into thuanpq-fix-bug-on-sidebar-member-avatar-not-shown 2017-12-11 21:47:15 +02:00
Lauri Ojansivu ddcdcb6e08 Use Node v6.12.2 and Meteor v1.6.0 2017-12-11 21:41:52 +02:00
Lauri Ojansivu 7afea1809f Revert Meteor 1.6.1 upgrade because it broke Wekan. So now using Meteor 1.6. 2017-12-11 21:13:30 +02:00
Lauri Ojansivu 1790b99fe0 Version updates. 2017-12-11 18:15:02 +02:00
Thuan Pham Quoc d5d661b131 Fixed - make it easier to see the Adding Card btn at top of list 2017-12-10 23:03:13 +07:00
Thuan Pham Quoc 8a28e988e9 Always display attachment section for uploading file quickly 2017-12-10 22:53:45 +07:00
Thuan Pham Quoc d1d8e0b935 Fixed - bug on long url of attachment in card activity log 2017-12-09 00:41:29 +07:00
Thuan Pham Quoc 84d60b5908 Added - auto update card cover with latest uploaded image attachment of card 2017-12-09 00:36:23 +07:00
Thuan Pham Quoc 245d262705 Fixed - don't open swipebox on update card cover - download file - delete file 2017-12-08 23:57:53 +07:00
Thuan Pham Quoc c686cadfef Fixed - boards subscription should be placed at header for all other component can be used 2017-12-06 15:39:54 +07:00
Thuan Pham Quoc 26405c011f Fixed - bug on not able to see member avatar on sidebar activity 2017-12-06 15:24:53 +07:00
Lauri Ojansivu ba9e163dd5 Remove not needed packages. Upgrade packages. Update Sandstorm capnp path.
Note: This version does not work on Sandstorm yet.
2017-12-03 18:50:22 +02:00
Lauri Ojansivu 7c403053e3 Fix lint errors. 2017-12-03 04:00:55 +02:00
Lauri Ojansivu c52233cacf Update Meteor 1.6, Node 6.12 and NPM versions to Dockerfile. 2017-12-03 02:56:56 +02:00
Lauri Ojansivu d6a5cb534d Try upgrading Wekan to Node v6.12 and Meteor 1.6, still using MongoDB 3.2.18.
Standalone Wekan seems to work, needs testing.
This does not fix crash bug of MongoDB 3.4.x.
This version does not yet work on Sandstorm.
2017-12-03 02:29:37 +02:00
Lauri Ojansivu e2f768c6a0 Update Node to 4.8.6 and MongoDB to 3.2.18 2017-12-02 23:10:59 +02:00
Lauri Ojansivu 4c5eda0ae5 Merge branch 'thuanpq-fix-bug-on-missing-admin-panel-menuoption' into devel
Fixed Bug on not being able to see Admin Panel if not having access to Board List.
Thanks to thuanpq !
2017-12-02 22:20:44 +02:00
Lauri Ojansivu 670cc99b8f Fixed Bug on not being able to see Admin Panel if not having access to Board List.
Thanks to thuanpq !
2017-12-02 22:19:19 +02:00
Lauri Ojansivu 847843e51d Merge branch 'fix-bug-on-missing-admin-panel-menuoption' of https://github.com/thuanpq/wekan into thuanpq-fix-bug-on-missing-admin-panel-menuoption 2017-12-02 22:07:56 +02:00
Lauri Ojansivu 9261371c51 Fix lint error. 2017-12-02 22:04:20 +02:00
Lauri Ojansivu 233554a3d6 Move global subscription to template subscription so that subscription
will stop when template is unused. It's very important for efficiency
espacially with large number of users. Thanks to mfshiu !
2017-12-02 22:00:42 +02:00
Lauri Ojansivu fa281e3f5f Update translations. Add Latvian language. 2017-12-02 21:41:09 +02:00
Lauri Ojansivu fcf7c02c69 Merge branch 'thuanpq-allow-changing-user-password-in-admin-panel' into devel
Change password of any user in Standalone Wekan Admin Panel. Thanks to thuanpq !
2017-12-02 21:02:21 +02:00
Lauri Ojansivu 3a391d5539 Change password of any user in Standalone Wekan Admin Panel. Thanks to thuanpq ! 2017-12-02 21:01:40 +02:00
Thuan Pham Quoc 22e369804b Allow admin to change user password in admin panel 2017-12-01 15:55:53 +07:00
Thuan Pham Quoc 3dc326db6a Move user-admin subsciption to header 2017-12-01 15:26:41 +07:00
Thuan Pham Quoc b3eab212ae Fixed - Missing trailing comma comma-dangle 2017-12-01 15:15:44 +07:00
Thuan Pham Quoc 6d9d183674 Fixed - bug on not able to see ADMIN PANEL if not access Board List 2017-12-01 15:04:35 +07:00
Lauri Ojansivu 54036fd7a3 v0.60 2017-11-29 14:18:51 +02:00
Lauri Ojansivu c72792e4ed Merge branch 'nztqa-conflict-resolution-458' into devel
Optimize for mobile web, show single list per page with navigate bar.
Thanks to floatinghotpot and nztqa ! Related #953
2017-11-29 12:11:02 +02:00
Lauri Ojansivu c3e2ee1db8 Optimize for mobile web, show single list per page with navigate bar.
Thanks to floatinghotpot and nztqa ! Related #953
2017-11-29 12:03:41 +02:00
Lauri Ojansivu 5d8462ca11 Merge branch 'conflict-resolution-458' of https://github.com/nztqa/wekan into nztqa-conflict-resolution-458 2017-11-29 11:29:43 +02:00
Lauri Ojansivu 7e4b42e9b3 Fix: Frequent Subscriptions problem that make Excessive CPU usage.
Thanks to mfshiu ! Closes #1096, Closes wekan/wekan-mongodb#2
2017-11-29 11:23:49 +02:00
Lauri Ojansivu c609096700 Add SMTP test email button to Admin Panel. Thanks to nztqa ! 2017-11-29 11:00:15 +02:00
Lauri Ojansivu 79fa5f89f3 Merge branch 'nztqa-improve-smtp-testing' into devel
Add SMTP test email button to Admin Panel. Thanks to nztqa !
2017-11-29 10:54:03 +02:00
Lauri Ojansivu f224934ae0 Update translations. 2017-11-29 10:53:08 +02:00
nztqa c31d7455f7 Optimize for mobile web, show single list per page with navigate bar 2017-11-29 17:06:33 +09:00
Lauri Ojansivu 596dd87862 Fix typo 2017-11-28 09:30:22 +02:00
Lauri Ojansivu c048ce89f1 Merge branch 'improve-smtp-testing' of https://github.com/nztqa/wekan into nztqa-improve-smtp-testing 2017-11-28 08:49:44 +02:00
nztqa 44559b52a6 Add smtp test email translations 2017-11-28 13:26:46 +09:00
Lauri Ojansivu 162b15c0cd Merge branch 'nztqa-issue-1349' into devel
Fix: User with comment only permissions can remove another user from a card.
Thanks to nztqa ! Closes #1349
2017-11-27 13:15:00 +02:00
Lauri Ojansivu 3756b7b0fc Fix: User with comment only permissions can remove another user from a card.
Thanks to nztqa ! Closes #1349
2017-11-27 13:12:59 +02:00
nztqa 332f12ce28 Add alert method 2017-11-27 19:24:06 +09:00
Lauri Ojansivu d31d5fd47a Merge branch 'issue-1349' of https://github.com/nztqa/wekan into nztqa-issue-1349 2017-11-27 11:37:18 +02:00
Lauri Ojansivu 83efd5b872 Merge branch 'martinlindhe-devel' into devel
Fix some typos in readne. Thanks to martinlindhe !
2017-11-27 11:32:34 +02:00
nztqa c2fd03e113 Fix permissions (isBoardMember to isNotCommentOnly) 2017-11-27 17:52:21 +09:00
nztqa dffe3d5ade Add test SMTP settings 2017-11-27 16:44:19 +09:00
Martin Lindhe d7cefc0042 fix some typos 2017-11-25 11:56:33 +01:00
Lauri Ojansivu 33b7622897 v0.59 2017-11-23 17:47:15 +02:00
Lauri Ojansivu eb8083097f Merge branch 'pierreozoux-fix-log' into devel 2017-11-23 17:45:03 +02:00
Lauri Ojansivu 80c0c80a6a Fix not working stdout logging by removing Winston logger. Thanks to pierreozoux ! 2017-11-23 17:44:22 +02:00
pierreozoux e28f3692ca Revert 00a357cd70 to fix logging 2017-11-23 16:31:18 +01:00
Lauri Ojansivu 6bcc1cfc62 v0.58 2017-11-23 12:11:35 +02:00
Lauri Ojansivu 990003ee0f Update translations. 2017-11-23 12:08:01 +02:00
Lauri Ojansivu 60929fb200 v0.57 2017-11-23 11:45:44 +02:00
Lauri Ojansivu 45c78a05e2 Fix Winston logger. Thanks to pierreozoux ! 2017-11-23 11:40:03 +02:00
Lauri Ojansivu cf045e3c34 Merge branch 'pierreozoux-fix-logger' into devel
Fix logger. Thanks to pierreozoux !
2017-11-23 11:35:51 +02:00
Lauri Ojansivu 6575312e74 Merge branch 'fix-logger' of https://github.com/pierreozoux/wekan into pierreozoux-fix-logger
Conflicts:
	server/logger.js
2017-11-23 11:35:27 +02:00
pierreozoux ee22364354 Try to fix build 2017-11-23 10:30:56 +01:00
Lauri Ojansivu a64dbc4a9b Merge branch 'fix-logger' of https://github.com/pierreozoux/wekan into pierreozoux-fix-logger 2017-11-23 11:23:07 +02:00
pierreozoux ebff813f99 Try to fix build 2017-11-23 10:21:03 +01:00
Lauri Ojansivu 674d45a81c Add Gogs Integration as separate project. 2017-11-23 01:47:10 +02:00
pierreozoux b03c9b9879 Fix bug when LOGGER is enabled, but LOGGERS is empty. 2017-11-22 16:10:43 +01:00
pierreozoux 7f8f6bf3db Make logger enabled by default 2017-11-22 16:10:18 +01:00
pierreozoux 4ffe9438e0 Fix add logger bug
In case you want to have only the console, it will fail at the `Winston.add`
as it is already there.
2017-11-22 16:10:03 +01:00
Lauri Ojansivu fbf97d31a0 Maybe github does not like : at bullet point. 2017-11-21 13:28:22 +02:00
Lauri Ojansivu 0c5d6c2ade Try to fix markdown. Is there bug at GitHub? It did combine bullet points to same line. 2017-11-21 13:26:55 +02:00
Lauri Ojansivu 00737fa015 Try to fix markdown. 2017-11-21 13:24:42 +02:00
Lauri Ojansivu 0c9343ad88 Fix typo. 2017-11-21 13:22:49 +02:00
Lauri Ojansivu f31d007177 v0.56 2017-11-21 12:40:30 +02:00
Lauri Ojansivu 932a273ba0 Add bcrypt just to see if bson error goes away. 2017-11-21 12:39:26 +02:00
Lauri Ojansivu 9ea35b7188 Merge branch 'thuanpq-card-spent-time' into devel
Spent time/Overtime on card. Thanks to thuanpq ! Closes #1337
2017-11-21 11:31:04 +02:00
Lauri Ojansivu d76387aed2 Spent time/Overtime on card. Thanks to thuanpq ! Closes #1337 2017-11-21 11:30:18 +02:00
Lauri Ojansivu 77a4341621 Update translations. Added Greek language. 2017-11-21 11:25:59 +02:00
Lauri Ojansivu e162fe3c0f Merge branch 'card-spent-time' of https://github.com/thuanpq/wekan into thuanpq-card-spent-time 2017-11-21 10:03:02 +02:00
Lauri Ojansivu f3e7646cfa Merge branch 'couscous3-fix-title-editing-shift-key-firefox' into devel
Card details: fix title editing with shift key. Thanks to couscous3 !
2017-11-21 09:30:58 +02:00
Lauri Ojansivu 552fa32b87 Card details: fix title editing with shift key. Thanks to couscous3 ! 2017-11-21 09:30:31 +02:00
Lauri Ojansivu 8a4f5ed6e3 Merge branch 'fix-title-editing-shift-key-firefox' of https://github.com/couscous3/wekan into couscous3-fix-title-editing-shift-key-firefox 2017-11-21 09:28:37 +02:00
Lauri Ojansivu c8cef7551f Merge branch 'couscous3-remove-minicard-title-whitespace' into devel 2017-11-21 09:27:21 +02:00
Lauri Ojansivu 9c46c6c962 Remove erroneous minicard title whitespace. Thanks couscous3 ! 2017-11-21 09:26:50 +02:00
Lauri Ojansivu 01818a99b9 Merge branch 'remove-minicard-title-whitespace' of https://github.com/couscous3/wekan into couscous3-remove-minicard-title-whitespace 2017-11-21 09:24:44 +02:00
Lauri Ojansivu 70fb1c4650 Merge branch 'thuanpq-fix-board-list-long-desc' into devel
Fix: Board list with long-description boards not visible. Thanks thuanpq !
2017-11-21 09:22:41 +02:00
Lauri Ojansivu 5c743f12a1 Board list with long-description boards not visible. Thanks thuanpq ! 2017-11-21 09:22:23 +02:00
Lauri Ojansivu 5b9e8cce14 Merge branch 'fix-board-list-long-desc' of https://github.com/thuanpq/wekan into thuanpq-fix-board-list-long-desc 2017-11-21 09:19:06 +02:00
Lauri Ojansivu 06afa1ae35 Merge branch 'GhassenRjab-feature/copy-move-cards-x-boards' into devel
Copy/Move card to another board in Standalone Wekan.
Thanks to GhassenRjab and thuanpq ! Closes #797
2017-11-21 09:16:28 +02:00
Lauri Ojansivu a84db59898 Copy/Move card to another board in Standalone Wekan. Thanks to GhassenRjab and thuanpq ! Closes #797 2017-11-21 09:15:16 +02:00
Lauri Ojansivu 9441fb29c9 Fix Copy/Move cards. Thanks to thuanpq ! 2017-11-21 09:07:56 +02:00
couscous3 7dae37eeac card detail: fix title editing with shift key
in firefox there is no global `event` object, therefore we should use the `evt` argument from the event handler
2017-11-20 18:25:56 +01:00
couscous3 90fd3286a8 remove erroneous minicard title whitespace
introduced by the markdown viewer in commit #309c1d0 (the markdown viewer uses <p> tags which have a margin-bottom)
2017-11-20 18:07:37 +01:00
Thuan Pham Quoc 996fdc2bda Fixed issue on board list with long-desc boards 2017-11-20 23:28:46 +07:00
Thuan Pham Quoc 6dba4ccd4d Added red-green circle to board lists item for indicating board which has overtime logs or normal spent time log 2017-11-20 23:24:27 +07:00
Lauri Ojansivu b592e8ad14 Merge branch 'feature/copy-move-cards-x-boards' of https://github.com/GhassenRjab/wekan into GhassenRjab-feature/copy-move-cards-x-boards 2017-11-20 17:46:34 +02:00
Thuan Pham Quoc d38071457c Update spent time title to indicate Overtime or normal Spent time 2017-11-20 22:40:02 +07:00
Thuan Pham Quoc eec3c301bc Add card spent time to log time what can be overtime or not (will support filtering in future) 2017-11-20 22:26:31 +07:00
Lauri Ojansivu dfd0b21947 v0.55 2017-11-19 19:01:42 +02:00
Lauri Ojansivu 6d93e9ffb0 Add link to commit by xet7 to CHANGELOG invitation code fix. 2017-11-19 18:05:41 +02:00
Lauri Ojansivu 99be745f02 Fix: Invitation /sign-up page did not show input for invitation code. Thanks to xet7 ! 2017-11-19 18:04:02 +02:00
Lauri Ojansivu 62e43c0832 Fix: Error after sending invitation and joining board:
Exception while invoking method 'login' TypeError: Cannot read property 'loginDisabled' of undefined.
Thanks to nztqa ! Closes #1331
2017-11-19 17:51:26 +02:00
Lauri Ojansivu eceaac7998 Merge branch 'soohwa-add-rest-api-bettor-error-output' into devel
REST API better error output. Thanks to soohwa ! Related #1037
2017-11-19 10:45:04 +02:00
Lauri Ojansivu c01335ee29 REST API better error output. Thanks to soohwa ! Related #1037 2017-11-19 10:44:37 +02:00
Lauri Ojansivu 9353d785ea Fix: Helper to list boards for user. Thanks to milesibastos ! Closes #1326 2017-11-19 09:50:03 +02:00
Lauri Ojansivu 0ea96fca3f Merge branch 'thuanpq-devel' into devel
User Admin to Admin Panel: List users.
Change: is user admin, name, fullname, email address, is user active.
Not changing password yet. Thanks to thuanpq and xet7 ! Related #802
2017-11-19 01:45:58 +02:00
Lauri Ojansivu 75c5eeb046 Update translations. 2017-11-19 01:41:53 +02:00
Lauri Ojansivu 9f30eeae61 User Admin to Admin Panel: List users.
Change: is user admin, name, fullname, email address, is user active.
Not changing password yet. Thanks to thuanpq and xet7 ! Related #802
2017-11-19 01:25:28 +02:00
Lauri Ojansivu 6fc992e6d7 Change admin panel header order to info people version. 2017-11-19 01:05:43 +02:00
Lauri Ojansivu 622292e40e Make Admin Panel People page text translateable 2017-11-19 01:05:09 +02:00
Lauri Ojansivu 22e43e6591 Merge branch 'devel' of https://github.com/thuanpq/wekan into thuanpq-devel 2017-11-18 23:37:15 +02:00
Lauri Ojansivu 13d8e75c05 Merge branch 'brooksbecton-addMarkdownToTitle' into devel
Markdown in card/minicard/checlist titles
and checklist items. Next line: Shift+Enter. Submit: Enter. Closes #926.
Fix: Emoji detection breaks MAC addresses. Closes #1248.
Fix: Codeblocks should not be scanned for emoji. Closes #643.
Fix: Whitespace trimming breaks Markdown code block indentation. Closes #1288.
Thanks to brooksbecton !
2017-11-18 23:31:00 +02:00
Lauri Ojansivu 8ae9cb97f7 Markdown in card/minicard/checlist titles
and checklist items. Next line: Shift+Enter. Submit: Enter. Closes #926.
Fix: Emoji detection breaks MAC addresses. Closes #1248.
Fix: Codeblocks should not be scanned for emoji. Closes #643.
Fix: Whitespace trimming breaks Markdown code block indentation. Closes #1288.
Thanks to brooksbecton !
2017-11-18 23:30:20 +02:00
Thuan Pham Quoc b4c3e02b75 Fix Missing trailing comma in users.js 2017-11-16 14:14:03 +07:00
Brooks Becton ffb8b72b69 Updated comments about pressing enter on forms 2017-11-14 20:57:36 -06:00
Brooks Becton 309c1d08ff Added markdown support to card-titles, minicard-titles, checklist title, and checklist items 2017-11-14 20:41:05 -06:00
Ghassen Rjab ce4f158976 Hide list of boards in Copy|Move cards for Sandstorm users 2017-11-14 03:25:04 +01:00
Ghassen Rjab 5a37ba0d9f Move cards cross boards 2017-11-14 03:03:29 +01:00
Ghassen Rjab 59f4daf91e Copy cards cross boards 2017-11-14 03:03:08 +01:00
Thuan Pham Quoc fa1d8cd5ef Added update all user profile from admin panel 2017-11-08 11:34:37 +07:00
Thuan Pham Quoc e3b7f85cc3 Updated users methods to get user id from client on updating user data, is aimed to support admin update other user profile 2017-11-08 11:34:05 +07:00
Thuan Pham Quoc 3bead1bf78 Added pagination to people management in admin panel 2017-11-08 11:27:59 +07:00
Thuan Pham Quoc 1f6545e411 Added edit user from admin panel 2017-11-07 22:26:21 +07:00
Thuan Pham Quoc 29d54f46aa Added people list in admin panel , just raw data right now, will add more features soon 2017-11-07 14:01:27 +07:00
Thuan Pham Quoc 2d12a4f404 Add .idea to .gitignore 2017-11-06 17:34:32 +07:00
Lauri Ojansivu ba3c3f8289 v0.54 2017-11-02 02:11:27 +02:00
Lauri Ojansivu 6eef4043ca Merge branch 'amadilsons-softwiplimit' into devel
Soft WIP Limit. Thanks to amadilsons and xet7 ! Closes #1311
2017-11-02 01:29:49 +02:00
Lauri Ojansivu 999cdb2bb9 Soft WIP Limit. Thanks to amadilsons and xet7 ! Closes #1311 2017-11-02 01:29:23 +02:00
Lauri Ojansivu cc5435c780 Update translations. 2017-11-02 01:25:09 +02:00
Lauri Ojansivu e015e4245e Make it possible to translate text Soft WIP Limit. 2017-11-02 01:03:51 +02:00
amadilsons c17f26f6ba fix: always restore archived cards if wip limit is soft 2017-10-31 21:20:53 +00:00
amadilsons fdd1aad80d added soft wip limit feature, fixed wipLimit=0 bug (??) 2017-10-31 21:10:36 +00:00
Lauri Ojansivu 8bf3f300ad v0.52 2017-10-31 07:26:32 +02:00
Lauri Ojansivu 99455b2728 Update translations. 2017-10-31 07:24:03 +02:00
Lauri Ojansivu 1a232c7bbb Add iPhone favicon for Wekan. Thanks to guillaumebriday ! Closes #1317 2017-10-31 06:54:47 +02:00
Lauri Ojansivu d3d73e9cdd Merge branch 'Tentoe-boardimportbug' into devel
Fixed Members do not get included on board import from Wekan.
Thanks to Tentoe ! Closes #1255
2017-10-31 06:48:40 +02:00
Lauri Ojansivu 0c34cb97a7 Fixed Members do not get included on board import from Wekan. Thanks to Tentoe ! Closes #1255 2017-10-31 06:48:15 +02:00
Lauri Ojansivu 0df3e7a3c0 Merge branch 'boardimportbug' of https://github.com/Tentoe/wekan into Tentoe-boardimportbug 2017-10-31 06:28:00 +02:00
Lauri Ojansivu 29a08e5568 Merge branch 'brooksbecton-attachments-improvements' into devel 2017-10-31 06:20:02 +02:00
Lauri Ojansivu 09808840cd Image attachment resize on smaller screens and swipebox. Thanks to brooksbecton ! Closes #201 2017-10-31 06:19:24 +02:00
Lauri Ojansivu c5e36d9160 Merge branch 'attachments-improvements' of https://github.com/brooksbecton/wekan into brooksbecton-attachments-improvements 2017-10-31 06:02:55 +02:00
Lauri Ojansivu aa1646ad45 Merge branch 'ocdtrekkie-patch-1' into devel
Permit editing WIP limit. Thanks to nztqa and ocdtrekkie ! Closes #1310
2017-10-31 05:59:04 +02:00
Lauri Ojansivu c2173e073e Permit editing WIP limit. Thanks to nztqa and ocdtrekkie ! Closes #1310 2017-10-31 05:58:33 +02:00
Keven Kurz PC 81d00a9471 Covered case of no admin and no self mapping.
Now importer is always admin of the imported board so that no
undeletable boards can be created.
2017-10-29 17:36:31 +01:00
Keven Kurz PC e8cfed1f7b fixed Members do not get included on board import from WeKan #1255
fixed multiple errors where constants were mistakenly overridden.(or
trying to get a property of an object after making sure it doesn't
exits)

renamed wekanBoard Parameter from createBoardAndLabels for clairity

reworked adding admin for imorter
2017-10-29 16:34:49 +01:00
Brooks Becton 28c78fdfef Merge branch 'attachments-improvements' of github.com:brooksbecton/wekan into attachments-improvements 2017-10-28 10:15:57 -05:00
Brooks Becton d48043c7ee Added swipebox package and added it to attachement images
Also removed '.js-open-viewer' and it's styling stub
2017-10-28 10:15:47 -05:00
Brooks Becton dd1a8ade5e Added media queries to resize attatchments
media queries match other break points and break from a 3 column to 2 to 1
2017-10-28 10:15:47 -05:00
Brooks Becton d9705a0ec4 Added swipebox package and added it to attachement images
Also removed '.js-open-viewer' and it's styling stub
2017-10-28 10:15:05 -05:00
Jacob Weisz 58fbe8e6f2 Permit editing the WIP limit
This is a fix for #1310 and required for Edge users to be able to edit the WIP limit. (The up/down buttons appear to be "optional" according to the HTML5 spec, and can't be assumed to be present.)

I also believe I fixed a spelling error in the same section.

This PR is **NOT TESTED**
2017-10-26 23:48:24 -05:00
Brooks Becton 5c1ace7293 Merge branch 'attachments-improvements' of github.com:brooksbecton/wekan into attachments-improvements 2017-10-25 18:34:48 -05:00
Brooks Becton 0321d9770c Added media queries to resize attatchments
media queries match other break points and break from a 3 column to 2 to 1
2017-10-25 18:34:40 -05:00
Brooks Becton 6a2b6ef3c0 Added media queries to resize attatchments
media queries match other break points and break from a 3 column to 2 to 1
2017-10-25 18:22:34 -05:00
Lauri Ojansivu 01507576b1 v0.51 2017-10-25 17:38:01 +03:00
Lauri Ojansivu 94a6d9ae2f Merge branch 'devel' of github.com:wekan/wekan into devel 2017-10-25 17:28:01 +03:00
Lauri Ojansivu 64fe808a4a Update translations. 2017-10-25 17:27:45 +03:00
Lauri Ojansivu a493c314db Add more languages to Roboto font. Thanks to chromas-cro ! Closes #1299 2017-10-23 16:53:58 +03:00
Lauri Ojansivu d1670ee4c1 Add more languages to Roboto font. Thanks to chromas-cro ! Closes #1299 2017-10-23 16:51:36 +03:00
Lauri Ojansivu 2edced5467 Fix: User with comment only permission can add cards. Thanks to xet7 ! Closes #1301 2017-10-20 17:08:54 +03:00
Lauri Ojansivu 509b640588 Fix: User with comment only permission can add cards. Thanks to xet7 ! Closes #1301 2017-10-20 17:08:21 +03:00
Lauri Ojansivu 624c5aa9b2 Update changelog. 2017-10-20 15:53:27 +03:00
Lauri Ojansivu c5540ddcbd Change invitation link from sign-in to sign-up. Thanks to xet7 ! Closes #1300 2017-10-20 15:52:19 +03:00
Lauri Ojansivu b105f0e2e7 Update translations. Add Spanish of Argentina. 2017-10-20 15:43:54 +03:00
Lauri Ojansivu 99703035d7 Use paxctl to fix segfaut on Alpine Linux. Closes #1303 2017-10-20 14:34:15 +03:00
Lauri Ojansivu b92cde23aa Merge branch 'soohwa-1285-feature-disable-user' into devel
REST API:
- Disable and enable user login.
- Take ownership boards of a user.
- List boards of user.

Thanks to soohwa ! Closes #1285, closes #1220, closes #1118
2017-10-20 14:29:32 +03:00
Lauri Ojansivu 21f76bcacc REST API: Disable and enable user login. Take ownership boards of a user.
List boards of user. Thanks to soohwa ! Closes #1285, closes #1220, closes #1118
2017-10-20 14:29:07 +03:00
Lauri Ojansivu 0d7c1501ce Merge branch '1285-feature-disable-user' of https://github.com/soohwa/wekan into soohwa-1285-feature-disable-user 2017-10-16 18:43:22 +03:00
soohwa 97a23011da Add REST API better error output 2017-10-15 07:39:48 +02:00
Lauri Ojansivu 93d8a3f88a Update translations: es 2017-10-14 23:18:33 +03:00
soohwa 624719974e fix lint error 2017-10-13 09:15:52 +02:00
soohwa c290d63048 fix lint error 2017-10-13 09:00:25 +02:00
soohwa b55756216e fix lint errors 2017-10-13 08:46:25 +02:00
soohwa 77d23df87f Add the ability for the admin :
- disabling a login for a user (not himself)
- enabling a login for a user
- transfering the ownership of all user's boards to himself
2017-10-13 08:15:19 +02:00
Lauri Ojansivu 3ab33ed826 v0.50 2017-10-10 18:08:21 +03:00
Lauri Ojansivu 8f1f7a1d56 Fix and update translations. Thanks to xet7 ! Closes #1286 2017-10-10 17:57:26 +03:00
Lauri Ojansivu 4eccfb6c25 v0.49 2017-10-09 20:00:47 +03:00
Lauri Ojansivu a5daf5dc29 Fix: When WIP limit in use, hide also add card + button at top of list. Thanks to xet7 ! 2017-10-09 19:46:11 +03:00
Lauri Ojansivu 6a89914873 v0.48 2017-10-09 18:30:36 +03:00
Lauri Ojansivu 5532a0071a Merge branch 'amadilsons-userSelfRemove' into devel
User can leave board on Standalone Wekan. Thanks to amadilsons !
2017-10-09 18:23:25 +03:00
Lauri Ojansivu 46d7a33575 User can leave board on Standalone Wekan. Thanks to amadilsons ! 2017-10-09 18:22:50 +03:00
Lauri Ojansivu 2f0609db64 Update translations. 2017-10-09 18:13:16 +03:00
Lauri Ojansivu f16687fa94 Merge branch 'userSelfRemove' of https://github.com/amadilsons/wekan into amadilsons-userSelfRemove 2017-10-09 16:38:43 +03:00
Lauri Ojansivu dc82582391 Merge branch 'soohwa-fix-admin-create-user' into devel
REST API: Create user despite disabling registration.
Thanks to soohwa ! Closes #1232
2017-10-09 16:36:31 +03:00
Lauri Ojansivu ff7b001b00 REST API: Create user despite disabling registration.
Thanks to soohwa ! Closes #1232
2017-10-09 16:35:56 +03:00
Lauri Ojansivu 33cea11393 Merge branch 'fix-admin-create-user' of https://github.com/soohwa/wekan into soohwa-fix-admin-create-user 2017-10-09 15:57:42 +03:00
Lauri Ojansivu 10cb2db94f Merge branch 'amadilsons-issue783' into devel
WIP Limits. Thanks to amadilsons ! Closes #783
2017-10-09 15:55:44 +03:00
Lauri Ojansivu c346743234 WIP Limits. Thanks to amadilsons ! Closes #783 2017-10-09 15:55:11 +03:00
amadilsons 6ba1fc5ba1 user can now leave the board 2017-10-09 14:49:03 +02:00
Lauri Ojansivu de2acaec68 Update translations. 2017-10-09 15:37:43 +03:00
Lauri Ojansivu fb060ed2c5 Merge branch 'issue783' of https://github.com/amadilsons/wekan into amadilsons-issue783 2017-10-09 14:49:38 +03:00
Lauri Ojansivu c84187bdad Fix: Admin announcement can be viewed without signing in.
Thanks to nztqa ! Closes #1281
2017-10-09 14:48:05 +03:00
soohwa ad607c1291 Remove trailing space 2017-10-08 18:15:11 +09:00
soohwa b9be17360f Add comment 2017-10-07 08:33:28 +09:00
Lauri Ojansivu 23ff08382a Dockerfile base image to debian:jessie-slim 2017-10-06 19:33:36 +03:00
Lauri Ojansivu b34c62bbc7 Dockerfile base image from debian:8.9 to bitnami/minideb:jessie 2017-10-06 19:15:14 +03:00
Lauri Ojansivu e85d6d6c5e MongoDB v3.2.17 2017-10-06 19:14:23 +03:00
soohwa 8daa5b4848 Change fromAdmin into createdThroughApi 2017-10-06 23:08:22 +09:00
soohwa 273784b9e4 Clear "fromAdmin". Thx to nztqa. 2017-10-06 01:21:45 +09:00
amadilsons f77da76c68 added i18n translation, minor fix 2017-10-05 17:22:03 +02:00
amadilsons 214fe6a61f feature implemented, known bugs fixed 2017-10-05 16:46:55 +02:00
Lauri Ojansivu 38d1a424d0 v0.47 2017-10-04 21:57:41 +03:00
Lauri Ojansivu e4c08f6933 Update translations. 2017-10-04 21:47:30 +03:00
Lauri Ojansivu 3bee5ad7fe Merge branch 'nztqa-improve-slider-color' into devel
Use theme color for Slider for Comments only. Thanks to nztqa! Closes #1274
2017-10-04 20:45:42 +03:00
Lauri Ojansivu 296520f9ac Use theme color for Slider for Comments only. Thanks to nztqa! Closes #1274 2017-10-04 20:45:14 +03:00
amadilsons c865bfe497 most work concluded, code needs clean up, further testing required 2017-10-04 17:48:37 +02:00
amadilsons 089dbf0cf6 on its way 2017-10-04 11:12:52 +02:00
nztqa 527c430307 Add toggle switch-style for board color change events 2017-10-04 17:18:12 +09:00
nztqa de4ae2dc74 Add check to see if permission is available (with isBoardMember) 2017-10-04 17:06:52 +09:00
Lauri Ojansivu bab02bf8fa v0.46 2017-10-03 15:24:16 +03:00
Lauri Ojansivu 23a9ba0ef6 SECURIY FIX: Meteor allow/deny. Thanks to nztqa ! Closes #1271 2017-10-03 15:20:46 +03:00
Lauri Ojansivu c3804dc0fa SECURITY FIX: Meteor allow/deny. 2017-10-03 15:17:40 +03:00
Lauri Ojansivu 08bab70dbe Merge branch 'andresmanelli-devel' into devel 2017-10-03 15:09:57 +03:00
Lauri Ojansivu ed4c749cea Webhook parameters and response order. Thanks to andresmanelli ! 2017-10-03 15:09:25 +03:00
Lauri Ojansivu d6ef4a8266 Merge branch 'devel' of https://github.com/andresmanelli/wekan into andresmanelli-devel 2017-10-03 14:03:15 +03:00
Lauri Ojansivu 1d3e2ffadd Merge branch 'nztqa-improve-comment-only' into devel
Fix: Slider for Comments only does not work correctly with over 21 activities.
Thanks to nztqa ! Closes #1269
2017-10-03 14:01:47 +03:00
Lauri Ojansivu 0074317bd3 Fix: Slider for Comments only does not work correctly with over 21 activities.
Thanks to nztqa ! Closes #1269
2017-10-03 14:01:05 +03:00
nztqa 26aa9a4ac4 Use Meteor.subscribe instead of DOM manipulation for Hide system messages 2017-10-03 10:56:28 +09:00
nztqa e587964e82 Remove console log 2017-10-03 09:59:25 +09:00
Lauri Ojansivu 61dce8e65d Fix typo. 2017-10-01 16:12:29 +03:00
Lauri Ojansivu c18ded23a3 v0.45 2017-10-01 12:06:22 +03:00
Lauri Ojansivu ff5e88fca3 Merge branch 'nztqa-improve-announcement' into devel
Site Wide Announcement. Thanks to nztqa !
2017-10-01 10:44:42 +03:00
Lauri Ojansivu 8df9e681ed Fix lint errors. 2017-10-01 10:44:06 +03:00
Lauri Ojansivu 443c3a7ac6 Update translations. 2017-10-01 10:41:57 +03:00
Lauri Ojansivu c8cbb7697d Site Wide Announcement. Thanks to nztqa ! 2017-10-01 10:18:16 +03:00
Lauri Ojansivu d213d37dab Merge branch 'improve-announcement' of https://github.com/nztqa/wekan into nztqa-improve-announcement 2017-10-01 09:59:57 +03:00
Lauri Ojansivu a003161fa7 Merge branch 'nztqa-fix-create_label' into devel
git commit CHANGELOG.md -m "Hide create label from normal users, because only board admin can create labels.
Thanks to nztqa ! Closes #1229"
2017-10-01 09:58:35 +03:00
Lauri Ojansivu 51fd053119 Hide create label from normal users, because only board admin can create labels.
Thanks to nztqa ! Related #1229
2017-10-01 09:55:33 +03:00
Lauri Ojansivu 740c705748 Merge branch 'fix-create_label' of https://github.com/nztqa/wekan into nztqa-fix-create_label 2017-10-01 09:50:49 +03:00
Lauri Ojansivu a1d0672739 Merge branch 'nztqa-improve-activities' into devel
Slider for Comments only in activity feed.
Thanks to nztqa ! Closes #1182
2017-10-01 09:48:52 +03:00
Lauri Ojansivu 7d3fed56ae Slider for Comments only in activity feed.
Thanks to nztqa ! Closes #1182
2017-10-01 09:47:53 +03:00
Lauri Ojansivu a0cccb736c Merge branch 'improve-activities' of https://github.com/nztqa/wekan into nztqa-improve-activities 2017-10-01 09:42:15 +03:00
Lauri Ojansivu 6ec14ee52b Merge branch 'nztqa-fix-copy-card' into devel
Fix Data inconsistency when copying card.
Thanks to nztqa ! Related #1218
2017-10-01 09:40:27 +03:00
Lauri Ojansivu 4b995e88ba Fix Data inconsistency when copying card.
Thanks to nztqa ! Related #1218
2017-10-01 09:39:35 +03:00
Lauri Ojansivu 2ae0dc315f Merge branch 'fix-copy-card' of https://github.com/nztqa/wekan into nztqa-fix-copy-card 2017-10-01 09:35:36 +03:00
nztqa a88ac6113e Rename notice -> announcement 2017-10-01 12:43:15 +09:00
soohwa 42ca385a36 Fix password not saved 2017-10-01 10:15:54 +09:00
Lauri Ojansivu e6a866cb9e v0.44 2017-09-30 20:29:41 +03:00
Lauri Ojansivu 8680d7727b Merge branch 'amadilsons-issue881' into devel
Confirm popup appears before Checklist Delete.
Thanks to amadilsons ! Closes #881
2017-09-30 16:55:10 +03:00
Lauri Ojansivu d8169138e5 Confirm popup appears before Checklist Delete.
Thanks to amadilsons ! Closes #881
2017-09-30 16:54:42 +03:00
Lauri Ojansivu 6bb2302f81 Update translations. 2017-09-30 16:50:38 +03:00
Lauri Ojansivu 90d904e10d Restore spacing. 2017-09-30 16:29:38 +03:00
Lauri Ojansivu 9e075fb2da Merge branch 'issue881' of https://github.com/amadilsons/wekan into amadilsons-issue881 2017-09-30 15:51:12 +03:00
Lauri Ojansivu 222c071925 Merge branch 'GhassenRjab-feature/fix-trello-import' into devel
Fix errors when importing from Trello.
Thanks to GhassenRjab ! Closes #1243, closes #1245
2017-09-30 13:18:08 +03:00
Lauri Ojansivu 0e3620c776 Fix errors when importing from Trello.
Thanks to GhassenRjab ! Closes #1243, closes #1245
2017-09-30 13:17:40 +03:00
Andrés Manelli de1ca1d12a Send result before webhook 2017-09-29 18:47:40 -03:00
Andrés Manelli 196f959f1d Add some parameters to webhook 2017-09-29 17:11:13 -03:00
amadilsons a918d36533 mostly frontend work, lists coll update with wipLimit field 2017-09-29 16:52:53 +02:00
amadilsons e03f2102de fixed linting error 2017-09-29 14:23:54 +02:00
amadilsons 4a20208d95 removed unnecessary deleteDialog helper, delete dialog now uses tap-i18n 2017-09-29 14:13:36 +02:00
nztqa 0e43a5561b Add check to see if permission 2017-09-29 15:02:35 +09:00
amadilsons c9c650664f basic frontend setup, List model updated with wipLimit field 2017-09-28 16:59:53 +02:00
nztqa aa1876f94c Add message from service administrator 2017-09-28 16:57:04 +09:00
Ghassen Rjab 109cd08151 Use a default color (black) for labels from Trello 2017-09-27 22:23:55 +01:00
amadilsons 9940d635b4 removed linting errors 2017-09-27 15:42:48 +02:00
amadilsons dcd4a2f1e3 code clean up 2017-09-27 14:50:00 +02:00
amadilsons 75f15f1be2 Merge branch 'master' of https://github.com/wekan/wekan into issue881 2017-09-27 14:42:18 +02:00
amadilsons bbe37cfad8 sugested fix for issue #881 2017-09-27 14:29:52 +02:00
Ghassen Rjab f883757552 Ignore checklists with missing cards 2017-09-26 06:58:39 +01:00
Lauri Ojansivu eb945f26a3 v0.43 2017-09-25 19:47:10 +03:00
Lauri Ojansivu a62c8eb5a0 Add emojis back, because removing them broke local dev Sandstorm.
Thanks to xet7 ! Opens #1248, opens #743, opens #643, opens #323
2017-09-25 19:40:41 +03:00
Lauri Ojansivu f0b7f34928 v0.42 2017-09-25 18:40:33 +03:00
Lauri Ojansivu c4fd729b34 Remove emoji support, because it breaks MAC addresses, urls, code etc.
Thanks to xet7 ! Closes #1248, closes #743, closes #643, closes #323
2017-09-25 18:30:26 +03:00
soohwa ee94735922 Lint error 2017-09-25 22:14:13 +09:00
soohwa deef0855d5 Fix https://github.com/wekan/wekan/issues/1249 2017-09-25 21:03:18 +09:00
nztqa 61ee107c27 Disable button when "Hide system messages" in user profile setting is valid 2017-09-25 20:27:54 +09:00
Lauri Ojansivu fb79c8786a v0.41 2017-09-25 13:16:07 +03:00
nztqa b503ba1144 Add comments only in activity feed 2017-09-25 14:52:55 +09:00
nztqa 860ae6f38d Remove cover id 2017-09-25 13:52:44 +09:00
Lauri Ojansivu 415343bbd0 v0.40 2017-09-25 01:02:00 +03:00
Lauri Ojansivu 1dd66fdac2 Merge branch 'soohwa-admin-create-user' into devel
REST API: Create user despite disabling registration.
Thanks to soohwa ! Closes #1232
2017-09-25 00:56:04 +03:00
Lauri Ojansivu d4d20d2a43 REST API: Create user despite disabling registration.
Thanks to soohwa ! Closes #1232
2017-09-25 00:49:07 +03:00
Lauri Ojansivu f7a1c4896b Fix lint errors. 2017-09-24 17:08:28 +03:00
Lauri Ojansivu cb4a679050 Merge branch 'admin-create-user' of https://github.com/soohwa/wekan into soohwa-admin-create-user 2017-09-24 17:03:41 +03:00
Lauri Ojansivu 6addc3c217 Merge branch 'mario-orlicky-devel' into devel
Added plus button to add card on top of the list.
Thanks to mario-orlicky ! Closes #1233
2017-09-24 17:01:11 +03:00
Lauri Ojansivu d0d2406186 Added plus button to add card on top of the list.
Thanks to mario-orlicky ! Closes #1233
2017-09-24 17:00:40 +03:00
Lauri Ojansivu 2c8876aa2e Merge branch 'devel' of https://github.com/mario-orlicky/wekan into mario-orlicky-devel 2017-09-24 16:47:39 +03:00
Lauri Ojansivu d974311d9b Merge branch 'GhassenRjab-feature/keep-state-checklist' into devel
Keep state of checklist items when moved to another checklist.
Thanks to GhassenRjab ! Related #876
2017-09-24 16:45:01 +03:00
Lauri Ojansivu 802dc94363 Keep state of checklist items when moved to another checklist.
Thanks to GhassenRjab ! Related #876
2017-09-24 16:44:24 +03:00
Mário Orlický 3fa969eb26 #1233 Added plus button to add card on top of the list 2017-09-24 15:17:14 +02:00
Ghassen Rjab c3cccfc66e Update Checklists client
Use new methods added in Checklist model
2017-09-24 02:15:33 +01:00
Ghassen Rjab 28eca2a11f Update Checklist model to keep checklist item state when moved
- Remove newItemIndex field (no longer needed)
- Use Underscore.js to sort checklist items
- Add helper method to generate new Items Ids so we can use it in model and in client
- Add addFullItem method to add an item from object
- Update sort when items are being added or removed
2017-09-24 02:14:23 +01:00
Ghassen Rjab 6e5d9f9bb6 Remove newItemIndex of Checklist Collection from migration script
We no longer need this field
2017-09-24 02:09:21 +01:00
none 57d6180a7a Allow admin to create user despite disabling registration throught rest api. 2017-09-23 15:20:11 +09:00
Lauri Ojansivu 5f697eac05 Merge branch 'GhassenRjab-hotfix/sort-checklists-items' into devel
Fix: Checklist items are lost when moving items to
another checklist. Thanks to GhassenRjab ! Related #876
2017-09-23 08:10:48 +03:00
Lauri Ojansivu e97c2c7bf0 Add migration script to add sort field to checklists
and their items. Thanks to GhassenRjab ! Related #876
2017-09-23 07:52:43 +03:00
Ghassen Rjab 20ba743f9b Fix lint errors 2017-09-23 01:02:44 +01:00
Ghassen Rjab 6921452a7d Add migration script to add sort field to checklists and their items 2017-09-22 22:35:07 +01:00
Lauri Ojansivu 43a58c92ac Merge branch 'umbertooo-addChecklist-notification' into devel
Add translations (en/de/fi) for email notifications regarding
checklists and checklist items. Thanks to umbertooo and xet7 ! Closes #1225
2017-09-22 22:24:05 +03:00
Lauri Ojansivu b8ddef1a23 Add translations (en/de/fi) for email notifications regarding
checklists and checklist items. Thanks to umbertooo and xet7 ! Closes #1225
2017-09-22 22:23:39 +03:00
Lauri Ojansivu fdf25a274f Update translations. 2017-09-22 22:12:55 +03:00
Felix Michels 0bbfa632f7 add translation (en/de) for email notifications regarding checklists and checklist items 2017-09-22 09:50:40 +02:00
Lauri Ojansivu f98d640e1e v0.39 2017-09-17 22:42:29 +03:00
Lauri Ojansivu fcdc1637fc Update translations. 2017-09-17 22:26:39 +03:00
Lauri Ojansivu cf8e1da383 Merge branch 'GhassenRjab-feature/import-checklist-sort' into devel
Import checklist sort attributes from Wekan and Trello.
Thanks to GhassenRjab ! Related #876
2017-09-17 06:55:02 +03:00
Lauri Ojansivu eb55b978aa Import checklist sort attributes from Wekan and Trello. Thanks to GhassenRjab ! 2017-09-17 06:54:40 +03:00
Ghassen Rjab a410dc50bb Import sort attribute of checklists and its items from Trello 2017-09-16 20:01:54 +01:00
Ghassen Rjab 2f69e65dc0 Import sort attribute of checklists and its items from Wekan
If no sort was found (Old format), we use checklist or checklist item index in the array instead
2017-09-16 19:59:03 +01:00
Lauri Ojansivu 5ef24437a3 v0.38 2017-09-13 23:02:18 +03:00
Lauri Ojansivu 7a6babe878 Update translations. 2017-09-13 22:26:37 +03:00
Lauri Ojansivu f9245727a6 Merge branch 'frmwrk123-issue-1213' into devel
Card title is now pre-filled in copy card dialog.
Thanks to frmwrk123 ! Related #1213
2017-09-13 20:42:21 +03:00
Lauri Ojansivu 9bfdc1932f Card title is now pre-filled in copy card dialog.
Thanks to frmwrk123 ! Related #1213
2017-09-13 20:41:16 +03:00
Lauri Ojansivu 59a76ed144 Merge branch 'issue-1213' of https://github.com/frmwrk123/wekan into frmwrk123-issue-1213 2017-09-13 20:37:11 +03:00
Lauri Ojansivu 68897a77dc Merge branch 'frmwrk123-issue-876' into devel
Reorder checklists. Move checklist item to another checklist.
Thanks to frmwrk123 ! Related #876
2017-09-13 20:28:11 +03:00
Lauri Ojansivu b7c7b93640 Reorder checklists. Move checklist item to another checklist. Thanks to frmwrk123 ! Related #876 2017-09-13 20:16:22 +03:00
Jim Martens 1442fd637a Implemented checklist item sorting across checklists 2017-09-12 10:38:03 +02:00
Jim Martens f2ca520a69 Prepared template for sortable checklist items 2017-09-12 10:37:16 +02:00
Jim Martens f3f845dde8 Added support for sorted checklist items 2017-09-12 10:36:42 +02:00
Jim Martens a9ca17426b Existing title of card is pre-filled in copy dialog 2017-09-12 10:30:35 +02:00
Lauri Ojansivu 3bb8431827 Update translations. 2017-09-09 23:16:35 +03:00
Lauri Ojansivu fb8330353c Rename New integration to New Outgoing Webhook 2017-09-09 22:44:04 +03:00
Lauri Ojansivu 1ee11e1cfd v0.37 2017-09-09 18:12:18 +03:00
Lauri Ojansivu ce98c86fb3 Merge branch 'frmwrk123-issue-519' into devel
Copy card within one board. Thanks to frmwrk123 !
2017-09-09 01:12:15 +03:00
Lauri Ojansivu 95c11415e2 Copy card within one board. Thanks to frmwrk123 ! 2017-09-09 01:11:44 +03:00
Lauri Ojansivu 5aa3b405fa Update translations. 2017-09-09 00:39:27 +03:00
Jim Martens 3a1859eb31 Added translation for copy card popup title
Only English and German were added.
2017-09-05 13:33:12 +02:00
Jim Martens a38b4c6a83 Added copy card functionality 2017-09-05 13:30:38 +02:00
Jim Martens 7c16e07f7d Added copy card to template 2017-09-05 13:30:18 +02:00
Lauri Ojansivu 5d12423b9d v0.36 2017-09-02 17:14:24 +03:00
Lauri Ojansivu a3d4a94890 Merge branch 'GhassenRjab-feature/manual-attachments-activities' into devel
Import attachments related activities from Wekan and Trello.
Thanks to GhassenRjab ! Closes #1157
2017-09-02 16:30:43 +03:00
Lauri Ojansivu eb9b809175 Import attachments related activities from Wekan and Trello.
Thanks to GhassenRjab ! Closes #1157
2017-09-02 16:30:09 +03:00
Lauri Ojansivu 17cf8ded07 Merge branch 'feature/manual-attachments-activities' of https://github.com/GhassenRjab/wekan into GhassenRjab-feature/manual-attachments-activities 2017-09-02 16:05:14 +03:00
Ghassen Rjab 181af6f250 Fix lint errors 2017-09-02 13:42:23 +01:00
Ghassen Rjab 2e845a5134 Uncomment code about adding attachments' related activities 2017-09-02 13:19:31 +01:00
Ghassen Rjab 255df20da0 Put 'this' in 'self' variable
For some reason, TrelloCreator didn't keep 'this' reference
2017-09-02 13:18:29 +01:00
Ghassen Rjab bc4ea6fd9a Add idMemberCreator to Trello attachment
We need this field to attribute attachment to the user who uploaded it
2017-09-02 13:17:03 +01:00
Ghassen Rjab 6ff0cf91e2 Add source field to imported attachments
We use this field to prevent adding attachments' related activities automatically only. Then this field will be removed.
2017-09-02 07:17:42 +01:00
Lauri Ojansivu d4537af3b4 v0.35 2017-09-02 00:09:51 +03:00
Lauri Ojansivu e3d2d6b292 Update translations. 2017-09-01 23:40:43 +03:00
Lauri Ojansivu e041f55254 Merge branch 'andresmanelli-devel' into devel
Add more than one Outgoing Webhook. Thanks to andresmanelli !
2017-09-01 23:01:34 +03:00
Lauri Ojansivu ba9f4fa7b7 Add more than one Outgoing Webhook. Thanks to andresmanelli ! 2017-09-01 23:00:47 +03:00
Lauri Ojansivu 01bbc089da Merge branch 'devel' of https://github.com/andresmanelli/wekan into andresmanelli-devel 2017-09-01 22:11:13 +03:00
Lauri Ojansivu 491a352792 Merge branch 'GhassenRjab-hotfix/issue-1198' into devel
Fix errors caused by checklist items activities.
Thanks to GhassenRjab and nztqa ! Closes #1198
2017-09-01 22:06:17 +03:00
Lauri Ojansivu 8d37a0418a Fix errors caused by checklist items activities.
Thanks to GhassenRjab and nztqa ! Closes #1198
2017-09-01 22:04:56 +03:00
Andrés Manelli 1048718f0b Fix null userId. Fix description field name 2017-08-31 21:20:46 -03:00
Ghassen Rjab 4ad4c6ea22 Assign user to attachment before inserting 2017-08-31 22:14:57 +01:00
Ghassen Rjab ad09630d4e use beforeWrite method of CollectionFS instead of collection-hooks 2017-08-31 22:02:11 +01:00
Ghassen Rjab a579125a1f Delete all activities related to a checklist when it is deleted 2017-08-31 06:58:32 +01:00
Ghassen Rjab ee938c0423 Delete activity related to checklist item when the item is deleted 2017-08-31 06:58:02 +01:00
Andrés Manelli 5bc95511e5 Allow delete from client. List all integrations in web UI 2017-08-30 00:58:34 -03:00
Andrés Manelli f566022aa4 Add activity subscription to integrations. Add API for integrations. Allow multiple integrations per board 2017-08-30 00:56:09 -03:00
Lauri Ojansivu ddc21046b9 v0.34 2017-08-30 01:05:41 +03:00
Lauri Ojansivu 51206cb108 Merge branch 'GhassenRjab-feature/import-activities' into devel
Import Trello and Wekan board times of creation of activities.
Thanks to GhassenRjab ! Related #1157
2017-08-30 00:59:29 +03:00
Lauri Ojansivu 200d49d369 Import Trello and Wekan board times of creation of activities. Thanks to GhassenRjab ! Related #1157 2017-08-30 00:56:49 +03:00
Lauri Ojansivu 55023171af Update translations. 2017-08-30 00:55:34 +03:00
Lauri Ojansivu decb31ffa4 Merge branch 'feature/import-activities' of https://github.com/GhassenRjab/wekan into GhassenRjab-feature/import-activities 2017-08-30 00:24:49 +03:00
Lauri Ojansivu ecb4863c39 v0.33 , includes new Sandstorm version. 2017-08-29 08:10:27 +03:00
Lauri Ojansivu 31c7ada591 Merge branch 'GhassenRjab-hotfix/sandstorm-export-import' into devel
Fix Wekan Import Export on Standalone and Sandstorm.
Thanks to GhassenRjab and xet7 ! Related #799
2017-08-29 02:03:53 +03:00
Lauri Ojansivu b4ec609fe0 Fix Wekan Import Export on Standalone and Sandstorm. Thanks to GhassenRjab and xet7 ! Related #799 2017-08-29 02:02:53 +03:00
Lauri Ojansivu d55c952289 Standalone Export has modifiedAt missing, adding modifiedAt to fix it. Thanks to xet7 ! 2017-08-29 01:56:01 +03:00
Ghassen Rjab afc002d81a Make userId optional when importing Wekan boards
Sandstorm will have an activity of adding a member by default which will have an empty userId. This caused issues when importing exported Sandstorm boards.
2017-08-28 22:03:21 +01:00
Lauri Ojansivu 06644d9c71 Merge branch 'pkuhner-fix-smtp-uri-malformed' into devel
Percent-encode SMTP password to prevent URI malformed errors.
Thanks to pkuhner ! Closes #1181
2017-08-26 03:46:51 +03:00
Lauri Ojansivu a4dfdd4fd1 Percent-encode SMTP password to prevent
URI malformed errors. Thanks to pkuhner ! Closes #1181
2017-08-26 03:46:24 +03:00
Lauri Ojansivu e21b3e6bb2 Merge branch 'fix-smtp-uri-malformed' of https://github.com/pkuhner/wekan into pkuhner-fix-smtp-uri-malformed 2017-08-26 03:39:27 +03:00
Lauri Ojansivu 777b65b1f7 Merge branch 'jonasob-username-matching' into devel
Usernames can now include dots (.) Thanks to jonasob !
2017-08-26 03:36:35 +03:00
Lauri Ojansivu 80a13be3e2 Usernames can now include dots (.) Thanks to jonasob ! 2017-08-26 03:35:53 +03:00
Lauri Ojansivu 27340ec8f7 Merge branch 'username-matching' of https://github.com/jonasob/wekan into jonasob-username-matching 2017-08-26 03:24:55 +03:00
Lauri Ojansivu 84d40bd3e3 Copy card link to clipboard. Thanks to xet7 ! Closes #1188 2017-08-26 03:14:31 +03:00
Jonas Oberg fe5ea60847 Usernames should be able to include dots (.) 2017-08-25 08:22:20 +02:00
Pierre Kuhner 4d4c127b99 Fix template literals syntax 2017-08-24 17:10:50 +02:00
Pierre Kuhner c99a950979 Percent-encode SMTP password to prevent URI malformed errors
Fix URIError: URI malformed errors when sending email with SMTP password containing some special characters.
See Sections 2.1 and 3.2 of RFC 3986.
2017-08-24 15:23:49 +02:00
Ghassen Rjab a2d7e2cb74 Fix dates of activities related to comments imported from Trello 2017-08-24 01:05:53 +01:00
Lauri Ojansivu 1b40c42cab Merge branch 'danhawkes-devel' into devel
Add web manifest so Wekan can be used as Standalone App
on Desktop with Chrome or Firefox. Thanks to danhawkes ! Closes #1154
2017-08-24 00:57:53 +03:00
Lauri Ojansivu 2740f8c31e Add web manifest so Wekan can be used as Standalone App
on Desktop with Chrome or Firefox. Thanks to danhawkes ! Closes #1154
2017-08-24 00:57:01 +03:00
Lauri Ojansivu 7d52a29620 Fixed lint error by using dot notation. 2017-08-23 23:43:12 +03:00
Lauri Ojansivu 93f08eb9c7 Merge branch 'devel' of https://github.com/danhawkes/wekan into danhawkes-devel 2017-08-23 23:29:01 +03:00
Lauri Ojansivu 1cc104e07e Update translations. 2017-08-23 23:21:52 +03:00
Lauri Ojansivu 36b642be09 Merge branch 'andresmanelli-webhook-ids' into devel
Gogs integration part 1. Thanks to andresmanelli !
2017-08-23 22:24:18 +03:00
Lauri Ojansivu 0554d576d5 Gogs integration part 1. Thanks to andresmanelli ! 2017-08-23 22:23:33 +03:00
Ghassen Rjab f1488436b8 Import Trello board activities 2017-08-23 06:42:25 +01:00
Ghassen Rjab 5665c755cb Import Wekan board activities
There is a minor catch here, we can't import activities related to adding attachments for now
2017-08-20 22:45:57 +01:00
Dan Hawkes 061d91ae7c Add web manifest
Adds a basic web manifest to support progressive web-app use.
2017-08-20 17:36:37 +01:00
Andrés Manelli a96ece2c11 Add some IDs to webhook body 2017-08-16 11:09:32 -03:00
Lauri Ojansivu 1e7e9d2715 Try newer Debian on Dockerfile. 2017-08-15 00:41:13 +03:00
Lauri Ojansivu 783dfc7495 Update translations. 2017-08-14 11:34:56 +03:00
Lauri Ojansivu c31f2d6a6c Merge branch 'nztqa-fix-checkitem-css' into devel
Fix Squeezed tickbox in Card. Thanks to nztqa ! Closes #1163
2017-08-11 17:00:28 +03:00
Lauri Ojansivu 41bb5d51ab Fix Squeezed tickbox in Card. Thanks to nztqa ! Closes #1163 2017-08-11 16:58:45 +03:00
nztqa f3467dab4a Fix flex property width of first column 2017-08-10 16:19:09 +09:00
Lauri Ojansivu 4586be46f7 Merge branch 'kubiko-devel' into devel
Ubuntu snap: Use version scriptlet. Thanks to kubiko !
2017-08-09 15:21:09 +03:00
Lauri Ojansivu 1f5d806a65 Ubuntu snap: Use version scriptlet. Thanks to kubiko ! 2017-08-09 15:20:24 +03:00
Lauri Ojansivu 723d9b4eae Merge branch 'devel' of https://github.com/kubiko/wekan into kubiko-devel 2017-08-09 15:18:03 +03:00
Lauri Ojansivu 719c5404f3 Merge branch 'nztqa-improve-account' into devel
Change Email address. Thanks to nztqa ! Closes #848
2017-08-09 15:14:11 +03:00
Lauri Ojansivu cb4f3ce52c Change Email address. Thanks to nztqa ! Closes #848 2017-08-09 15:13:33 +03:00
Lauri Ojansivu 2bd971a9b1 Update translations. 2017-08-09 15:09:10 +03:00
Lauri Ojansivu 7a0467c8c5 Capitalize accounts 2017-08-09 14:58:21 +03:00
Ondrej Kubik 6f5bbaf871 use version scriptlet instead of hardcoded version
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2017-08-08 20:26:42 +00:00
nztqa 6a10257fd7 Add change email address
Set allow email change in admin panel
2017-08-07 17:40:50 +09:00
Lauri Ojansivu 57219df16a Add version info location. 2017-08-03 16:32:53 +03:00
Lauri Ojansivu 06fdfd98b0 Fix typo. 2017-08-03 16:26:54 +03:00
Lauri Ojansivu 6a7d7d04b1 Merge branch 'nztqa-improve-info' into devel
Add display Wekan version number and runtime environment.
Thanks to nztqa! Closes #963 #356
2017-08-03 15:55:39 +03:00
Lauri Ojansivu 6b99d28768 Update translations. 2017-08-03 15:54:25 +03:00
Lauri Ojansivu 6d90c03225 Add display Wekan version number and runtime environment.
Thanks to nztqa! Closes #963 #356
2017-08-03 15:30:48 +03:00
Lauri Ojansivu 800b8bb6bd Change Infos to Version 2017-08-03 15:25:42 +03:00
Lauri Ojansivu 8ad704ca0a Merge branch 'improve-info' of https://github.com/nztqa/wekan into nztqa-improve-info 2017-08-03 14:56:36 +03:00
Lauri Ojansivu dca36b59a2 Add Commercial Support. 2017-08-03 14:55:06 +03:00
nztqa e407eb9a8b Add display wekan version number and runtime environment 2017-08-03 09:24:40 +09:00
Lauri Ojansivu 3085230b13 Add bounties. 2017-08-01 22:13:23 +03:00
Lauri Ojansivu d7c8f5242f v0.32 2017-07-30 19:10:53 +03:00
Lauri Ojansivu 417bce5a01 Fix lint error. 2017-07-30 19:05:48 +03:00
Lauri Ojansivu c0f67eb99b v0.31 2017-07-30 19:00:44 +03:00
Lauri Ojansivu 7e0bcacf91 Merge branch 'GhassenRjab-fix-files-access' into devel
FIX SECURITY ISSUE Files accessible without authentication.
Thanks to GhassenRjab ! Closes #1105
2017-07-30 18:42:02 +03:00
Lauri Ojansivu d85dc181d6 FIX SECURITY ISSUE Files accessible without authentication.
Thanks to GhassenRjab ! Closes #1105
2017-07-30 18:41:39 +03:00
Lauri Ojansivu 7984890cab Update translations. 2017-07-30 18:34:18 +03:00
Lauri Ojansivu a9d4538d53 Merge branch 'fix-files-access' of https://github.com/GhassenRjab/wekan into GhassenRjab-fix-files-access 2017-07-30 18:02:12 +03:00
Lauri Ojansivu bda15daa78 Add dwrensha's Sandstorm patch to Wekan so it does not need to be maintained separately. 2017-07-30 17:59:06 +03:00
Ghassen Rjab f521b7949a Fix files access bug 2017-07-30 04:27:38 +01:00
Lauri Ojansivu f9f529e53f Merge branch 'nztqa-fix-ie11-animation' into devel
Fix showing card activity history in IE11.
Thanks to nztqa ! Closes #646
2017-07-28 14:12:47 +03:00
Lauri Ojansivu 979a2025ef Fix showing card activity history in IE11.
Thanks to nztqa ! Closes #646
2017-07-28 14:12:27 +03:00
nztqa b24212d70a Fix keyframe property
Support for IE11
https://github.com/wekan/wekan/pull/646
2017-07-28 11:07:28 +09:00
Lauri Ojansivu a56e0b6d4a Revert back to MongoDB v3.2.15 because v3.2.16 is not yet available on Docker Hub. 2017-07-28 00:17:06 +03:00
Lauri Ojansivu 7c9b194bb6 MongoDB v3.2.16 2017-07-27 23:49:21 +03:00
Lauri Ojansivu 28cce312a8 v0.30 2017-07-27 22:29:39 +03:00
Lauri Ojansivu 1a5fe93500 v0.30 2017-07-27 22:27:08 +03:00
Lauri Ojansivu 5d24d3de2a Merge branch 'GhassenRjab-log-checklist-items' into devel
Add checklist items to activity log.
Thanks to GhassenRjab ! Closes #1025
2017-07-27 15:39:42 +03:00
Lauri Ojansivu 66da6362c8 Add checklist items to activity log.
Thanks to GhassenRjab ! Closes #1025
2017-07-27 15:39:07 +03:00
Lauri Ojansivu b0487e4dbc Update translations. 2017-07-27 15:35:57 +03:00
Ghassen Rjab 2b9bc5d046 Add checklist items to activity log 2017-07-26 22:51:15 +01:00
Lauri Ojansivu 01928bfe5a Merge branch 'nztqa-issue-template' into devel
Add GitHub issue template. Thanks to nztqa !
2017-07-25 18:22:27 +03:00
Lauri Ojansivu 0b0ceb4c0e Add GitHub issue template. Thanks to nztqa ! 2017-07-25 18:21:57 +03:00
Lauri Ojansivu 5c1662a7c1 Merge branch 'issue-template' of https://github.com/nztqa/wekan into nztqa-issue-template 2017-07-25 18:18:47 +03:00
Lauri Ojansivu 96c79f78cc Merge branch 'GhassenRjab-export-import-sandstorm' into devel
Export and import boards in Sandstorm.
Thanks to GhassenRjab ! Related #1144 and #799
2017-07-25 16:52:58 +03:00
Lauri Ojansivu 82d553721c Export and import boards in Sandstorm. Related #1144 and #799. 2017-07-25 16:52:22 +03:00
Lauri Ojansivu fe2163a546 Merge branch 'export-import-sandstorm' of https://github.com/GhassenRjab/wekan into GhassenRjab-export-import-sandstorm 2017-07-25 16:26:25 +03:00
Lauri Ojansivu 7b4970a8d9 Fix double slashes on snap. Related #962 2017-07-25 16:11:45 +03:00
nztqa 74f5628622 Add issue template 2017-07-25 15:22:40 +09:00
Ghassen Rjab 1eaada0feb A Sandstorm user can restore an archived board 2017-07-25 00:30:30 +01:00
Ghassen Rjab d2b1a837e6 Import boards in Sandstorm 2017-07-24 23:56:51 +01:00
Ghassen Rjab f34ef01de9 Fix import pages URLs 2017-07-24 23:53:09 +01:00
Ghassen Rjab 567aa89bd2 Add export and import in board menu in Sandstorm 2017-07-24 23:52:37 +01:00
Lauri Ojansivu 4fdcc144d5 Try to fix double slashes on Docker #962 2017-07-24 14:49:28 +03:00
Lauri Ojansivu dc547c38d1 Fix typo. 2017-07-22 15:05:33 +03:00
Lauri Ojansivu 048f7e0566 Add more screenshots to Features page. 2017-07-22 14:43:54 +03:00
Lauri Ojansivu 0e33c44831 Update screenshot url. 2017-07-22 12:41:21 +03:00
Lauri Ojansivu b0657ae5f5 New screenshot. 2017-07-22 12:37:08 +03:00
Lauri Ojansivu f96a6b2286 New screenshot. 2017-07-22 12:19:19 +03:00
Lauri Ojansivu d2d0ef2889 Not about security issue not fixed yet. 2017-07-21 22:04:31 +03:00
Lauri Ojansivu c02988c515 v0.29 2017-07-21 19:17:17 +03:00
Lauri Ojansivu b5836ab0ff Update translations. 2017-07-21 19:09:18 +03:00
Lauri Ojansivu 698e773e3a Update translations. 2017-07-20 04:11:28 +03:00
Lauri Ojansivu 604146b294 Merge branch 'GhassenRjab-export-import-checklists' into devel
Export and import checklists. Thanks to GhassenRjab !
2017-07-20 04:04:36 +03:00
Lauri Ojansivu e48198353f Export and import checklists. Thanks to GhassenRjab ! 2017-07-20 04:03:59 +03:00
Ghassen Rjab 12ec92a0b5 Import checklists 2017-07-20 00:57:20 +01:00
Ghassen Rjab 25ce99958c Export checklists 2017-07-20 00:24:21 +01:00
Lauri Ojansivu 3140067330 Merge branch 'zarnifoulette-devel' into devel
Fix: Activity user messed up when creating a card using the REST-API.
Thanks to zarnifoulette ! Closes #1045
2017-07-19 21:35:50 +03:00
Lauri Ojansivu b0dea10a38 Fix: Activity user messed up when creating a card using the REST-API.
Thanks to zarnifoulette ! Closes #1045
2017-07-19 21:35:18 +03:00
Lauri Ojansivu 2267dd0fd7 Merge branch 'devel' of https://github.com/zarnifoulette/wekan into zarnifoulette-devel 2017-07-19 21:23:36 +03:00
Lauri Ojansivu 57f9c1df69 Merge branch 'GhassenRjab-attachment-base64' into devel
Export and import attachments as base64 encoded files. Thanks to GhassenRjab !

Update translations.
2017-07-19 21:20:40 +03:00
Lauri Ojansivu f3f15f83b0 Export and import attachments as base64 encoded files. Thanks to GhassenRjab ! 2017-07-19 21:20:13 +03:00
Lauri Ojansivu aed3e64972 Update translations. 2017-07-19 21:12:44 +03:00
zago e2ee005a5f direct hook to bypass the checking step with API request 2017-07-19 10:27:23 +02:00
Ghassen Rjab bea876efd8 Updat Wekan board format check 2017-07-19 01:05:51 +01:00
Ghassen Rjab 0b72eeaf9d Fix texts in import board page 2017-07-16 09:11:05 +01:00
Ghassen Rjab 81e0d4e382 Export and import attachents as base64 encoded files 2017-07-15 22:10:46 +01:00
Lauri Ojansivu 52619ef622 Revert Debian 9 and gcc changes, because I got more errors with gpg not found and gosu permission denied. 2017-07-15 03:13:48 +03:00
Lauri Ojansivu 6357d2fa8b Try gcc 6 on Debian 9 2017-07-15 03:04:46 +03:00
Lauri Ojansivu 67f5a1326b Test Debian 9 Docker base image, how many vulnerabilies it fixes, and does it work. 2017-07-15 02:53:46 +03:00
Lauri Ojansivu 8bd71a4cc1 Ubuntu snap edge v0.28-SNAPSHOT 2017-07-15 00:39:50 +03:00
Lauri Ojansivu 3d4a7512f1 Wekan v0.28 2017-07-15 00:36:53 +03:00
Lauri Ojansivu 2302453b36 Node.js etc updates. Thanks to johnleeming !
Fix: Adding user to board causes node.js to crash. Thanks to nztqa ! Closes #1131
2017-07-15 00:01:45 +03:00
Lauri Ojansivu 753cc2e1e2 Try to fix build errors. 2017-07-14 23:28:22 +03:00
Lauri Ojansivu 7f8a334e12 Update translations. 2017-07-14 23:21:29 +03:00
Lauri Ojansivu 9513053816 Upgrade Node.js, MongoDB and Debian on Docker and Ubuntu snap edge to get security etc updates. 2017-07-14 23:10:57 +03:00
Lauri Ojansivu 4ab2c0d815 More text to link. 2017-07-14 00:23:57 +03:00
Lauri Ojansivu e1176f1e30 Add direct link to development links. 2017-07-14 00:22:35 +03:00
Lauri Ojansivu 069ca6df5e Fix typo. 2017-07-14 00:14:01 +03:00
Lauri Ojansivu 6e4a082411 Use Wekan board as demo. Add development links. 2017-07-14 00:12:28 +03:00
Lauri Ojansivu 992f9b70fe Old Wekan roadmap is not online, removing mention of it. 2017-07-14 00:01:15 +03:00
Lauri Ojansivu 55cbf7d4de Update translations. 2017-07-12 14:46:29 +03:00
Lauri Ojansivu 769bab6582 Better message when Wekan is loading. Closes #1113 2017-07-12 14:37:22 +03:00
Lauri Ojansivu 6b5a610d01 Better message when Wekan is loading. Closes #1113 2017-07-12 14:31:56 +03:00
Lauri Ojansivu 04fb2ae52c Try to fix Dockerfile 2017-07-12 03:59:52 +03:00
Lauri Ojansivu 2778c336bf Try to fix Dockerfile 2017-07-12 03:57:52 +03:00
Lauri Ojansivu eb83a9fb62 Try to fix Dockerfile 2017-07-12 03:55:05 +03:00
Lauri Ojansivu f6a70a28cb Try to fix Dockerfile 2017-07-12 03:41:15 +03:00
Lauri Ojansivu a21892b84f Try to fix Dockerfile 2017-07-12 03:36:53 +03:00
Lauri Ojansivu 246f1dd3ac Try to fix Dockerfile 2017-07-12 03:33:36 +03:00
Lauri Ojansivu 710eb75f3e Fix double-slash bug. Clone only latest from master branches. 2017-07-12 02:47:37 +03:00
Lauri Ojansivu afa5ec360f Merge branch 'nztqa-improve-notify' into devel
Add Feature: Outgoing Webhooks. Thanks to nztqa !
2017-07-12 02:30:53 +03:00
Lauri Ojansivu c649c87d16 Update translations. 2017-07-12 02:30:07 +03:00
Lauri Ojansivu c26317eddf Add Feature: Outgoing Webhooks. Thanks to nztqa ! 2017-07-12 02:20:00 +03:00
Lauri Ojansivu 510708d0e1 Merge branch 'improve-notify' of https://github.com/nztqa/wekan into nztqa-improve-notify 2017-07-12 01:59:07 +03:00
Lauri Ojansivu 19a71c0d92 Merge branch 'jtickle-devel' into devel
Fix double slash issue. Thanks to jtickle ! Closes #1110
2017-07-12 01:53:40 +03:00
Lauri Ojansivu 6fe4f00c44 Fix double slash issue. Thanks to jtickle ! Closes #1110 2017-07-12 01:52:05 +03:00
Lauri Ojansivu 2d595da6a6 Build Dockerfile with and without of USE_EDGE=true. 2017-07-12 01:48:46 +03:00
Lauri Ojansivu 8f075ec1a2 Merge branch 'devel' of https://github.com/jtickle/wekan into jtickle-devel 2017-07-12 01:37:02 +03:00
Lauri Ojansivu 1aea465a23 Merge branch 'GhassenRjab-devel' into devel
Import Wekan board. Thanks to GhassenRjab !
2017-07-12 01:29:57 +03:00
Lauri Ojansivu b25436e1bf Import Wekan board. Thanks to GhassenRjab ! 2017-07-12 01:28:41 +03:00
Lauri Ojansivu f89c37c1fd Update translations. 2017-07-12 01:25:07 +03:00
Ghassen Rjab c7b53becf3 Use right class for options list 2017-07-09 17:40:48 +01:00
nztqa 0e6cfdbb2a Add call outgoing webhooks method 2017-07-09 15:21:40 +09:00
nztqa 0d5e829c56 Add publication to integrations 2017-07-09 15:18:35 +09:00
nztqa e66c99499f Add input form in board menu 2017-07-09 15:14:33 +09:00
nztqa 429e2f9992 Add method outgoingWebhooks 2017-07-09 15:02:17 +09:00
nztqa bcd42ad958 Add integrations model 2017-07-09 14:59:58 +09:00
nztqa 24290b66a3 Add http and integrations 2017-07-09 14:57:38 +09:00
nztqa d31b4cd2d9 Add http package 2017-07-09 14:56:40 +09:00
Ghassen Rjab 3f4c285551 Add import Wekan board feature 2017-07-08 13:23:33 +01:00
zago cbcf10a02b fixe travis 2017-07-07 11:37:35 +02:00
zago cac82e4330 checking the authorId when adding card 2017-07-07 11:11:38 +02:00
Lauri Ojansivu 61b2c91ffe Update translations. 2017-07-05 19:10:08 +03:00
Jeff Tickle d461580749 Merge branch 'devel' of github.com:jtickle/wekan into devel 2017-07-05 11:38:04 -04:00
Jeff Tickle b5197fa673 Updated Dockerfile to build successfully when USE_EDGE=true 2017-07-05 11:37:01 -04:00
Lauri Ojansivu 13d7378dc5 Merge branch 'nztqa-improve-ui' into devel
Improve UI design of checklist items. Thanks to nztqa !
2017-07-04 11:15:38 +03:00
Lauri Ojansivu e9ad9b5be2 Improve UI design of checklist items. Thanks to nztqa ! 2017-07-04 11:14:43 +03:00
nztqa c5b83c04c1 Improve UI Design (checklists item)
1. Change background color on mouseover and remove it after mouseout
2. Increase the clickable area of title
2017-07-03 16:57:20 +09:00
Lauri Ojansivu 2c94254ec3 Update translations. 2017-07-02 09:39:31 +03:00
Lauri Ojansivu 4159aa0929 Merge branch 'nztqa-fix-checklistitem-empty' into devel
Fix: Possible to add empty item to checklist.
Thanks to nztqa ! Closes #1103
2017-07-02 00:51:38 +03:00
Lauri Ojansivu 0e5a6a9e9e Fix: Possible to add empty item to checklist.
Thanks to nztqa ! Closes #1103
2017-07-02 00:51:04 +03:00
nztqa 29f65be1e0 Add check to see if input is empty 2017-07-01 23:03:54 +09:00
Lauri Ojansivu cbbdf8442d Merge branch 'nztqa-improve-checklist' into devel
When finished input of checklist item, open new checklist item.
Thanks to nztqa ! Closes #828
2017-06-30 07:35:15 +03:00
Lauri Ojansivu a26db7f3c8 When finished input of checklist item, open new checklist item.
Thanks to nztqa ! Closes #828
2017-06-30 07:33:48 +03:00
nztqa 99d6bd4415 Improve input of checklist
When finished input of checklist item title,  open new checklist item.
2017-06-30 10:10:42 +09:00
Lauri Ojansivu 9ccffe5342 Merge branch 'zarnifoulette-devel' into devel
Fix: REST API: Add PUT method to update a card.
Thanks to zarnifoulette ! Related to #1037
2017-06-29 20:33:37 +03:00
Lauri Ojansivu 6ec217a5e2 Fix: REST API: Add PUT method to update a card. Thanks to zarnifoulette ! Related to #1037 2017-06-29 20:32:24 +03:00
Lauri Ojansivu 160205f139 Merge branch 'devel' of https://github.com/zarnifoulette/wekan into zarnifoulette-devel 2017-06-29 20:27:26 +03:00
zago afc30226ac fixe error 2017-06-29 15:45:27 +02:00
Lauri Ojansivu e8a661e0ea Merge branch 'zarnifoulette-devel' into devel
REST API: Add PUT method to update a card.
Thanks to zarnifoulette ! Related to #1037
2017-06-29 15:55:11 +03:00
Lauri Ojansivu 2c1509686d REST API: Add PUT method to update a card. Thanks to zarnifoulette ! Related to #1037 2017-06-29 15:54:49 +03:00
zago 95f1772280 linebreaker fixing 2017-06-29 14:10:45 +02:00
zago 3a99eb9c9f adding a put method to update a card 2017-06-29 12:24:33 +02:00
Lauri Ojansivu 1e52523505 v0.27 2017-06-28 14:31:57 +03:00
Lauri Ojansivu 592d0d8e4e v0.27 2017-06-28 12:23:14 +03:00
Lauri Ojansivu b0367491b9 Merge branch 'nztqa-fix-checklist' into devel
Fix duplicate id generation. Thanks to nztqa ! Closes #1090
2017-06-28 11:14:04 +03:00
Lauri Ojansivu f682de9690 Fix duplicate id generation. Thanks to nztqa ! Closes #1090 2017-06-28 11:13:39 +03:00
Lauri Ojansivu 5854805bdc Merge branch 'fix-checklist' of https://github.com/nztqa/wekan into nztqa-fix-checklist 2017-06-28 10:44:45 +03:00
nztqa e03c69ab8f Fix: id generation 2017-06-28 15:19:53 +09:00
Lauri Ojansivu 1ba0f912f1 Update translations. 2017-06-27 18:05:17 +03:00
Lauri Ojansivu 0fe247070a Merge branch 'kubiko-devel' into devel
Add snapcraft build support from source. Thanks to kubiko !

This can be used together with launchpad build system for
continuous integration. Intention is to push snaps build from
devel branch to edge channel, which can be installed by calling:

$ snap install -edge wekan

device will keep automatically updating to revisions as they
are released to edge channel.
2017-06-27 17:19:04 +03:00
Lauri Ojansivu aca2692214 Add snapcraft build support from source. Thanks to kubiko ! 2017-06-27 17:18:06 +03:00
Ondrej Kubik a538c14976 Adding snapcraft build support from source
Signed-off-by: Ondrej Kubik <ondrej.kubik@canonical.com>
2017-06-27 13:22:52 +00:00
Lauri Ojansivu 60495e4765 Update translations. 2017-06-27 12:36:37 +03:00
Lauri Ojansivu 0f5dba14cb Fix link to card. Thanks to nztqa ! Closes #975 2017-06-27 12:24:31 +03:00
Lauri Ojansivu 5c42394279 Merge branch 'nztqa-fix-link-card' into devel
Fix link to card. Thanks to nztqa ! Closes #975
2017-06-27 11:42:29 +03:00
Lauri Ojansivu 02a841b468 Merge branch 'fix-link-card' of https://github.com/nztqa/wekan into nztqa-fix-link-card 2017-06-27 11:21:46 +03:00
Lauri Ojansivu e7a58c764d Merge branch 'nztqa-fix-wrong-links' into devel
Fix incorrect attachment link with subfolder in the url.
Thanks to nztqa ! Closes #1015
2017-06-27 10:49:42 +03:00
Lauri Ojansivu c5381d30ed Fix incorrect attachment link with subfolder in the url. Thanks to nztqa ! Closes #1015 2017-06-27 10:49:11 +03:00
nztqa b94083e43f Fix link to card 2017-06-27 15:33:55 +09:00
nztqa ef0c729b27 Fix: incorrect attachment link with subfolder in the url 2017-06-27 11:37:16 +09:00
Lauri Ojansivu 8937f18423 Update translations. 2017-06-26 23:04:11 +03:00
Lauri Ojansivu f2a8a5d910 v0.26 2017-06-26 19:05:41 +03:00
Lauri Ojansivu 2356ad8fec Merge branch 'nztqa-fix-i18n-subfolder' into devel
Fix i18n route for subfolder. Thanks to nztqa ! Related: #973
2017-06-26 12:40:24 +03:00
Lauri Ojansivu 1f80f96735 Fix i18n route for subfolder. Thanks to nztqa ! Related: #973 2017-06-26 12:40:00 +03:00
Lauri Ojansivu 974825bbcf Merge branch 'fix-i18n-subfolder' of https://github.com/nztqa/wekan into nztqa-fix-i18n-subfolder 2017-06-26 12:34:36 +03:00
Lauri Ojansivu 6c9725a8c9 Merge branch 'nztqa-fix-adminPanel-subfolder' into devel
Fix admin panel route for subfolder. Thanks to nztqa ! Related: #973
2017-06-26 12:26:44 +03:00
Lauri Ojansivu db9fc3cde1 Fix admin panel route for subfolder. Thanks to nztqa ! Related: #973 2017-06-26 12:25:50 +03:00
nztqa 06bcb7adaa Update: camelcase to never does not check property names at all.
http://eslint.org/docs/2.0.0/rules/camelcase
2017-06-26 16:59:21 +09:00
nztqa 7d4015e043 Add i18n file route for subfolder 2017-06-26 15:45:34 +09:00
nztqa 2c4daae051 Add admin panel route for subfolder 2017-06-26 15:24:32 +09:00
Lauri Ojansivu 01f907897a Wekan relase v0.25 2017-06-24 14:06:04 +03:00
Lauri Ojansivu 9787ab4d51 NPM back to version 4.6.1 2017-06-24 13:45:46 +03:00
Lauri Ojansivu 868587c409 Merge branch 'GhassenRjab-fix-trello-import' into devel
Import due date from Trello. Thanks to GhassenRjab ! Closes #1081
2017-06-24 00:18:14 +03:00
Lauri Ojansivu 741a7887bd Import due date from Trello. Thanks to GhassenRjab ! Closes #1081 2017-06-24 00:17:48 +03:00
Ghassen Rjab aff4655134 Update import from Trello feature
Add importing the due date of a card
2017-06-23 17:58:13 +01:00
Lauri Ojansivu 9d74a76ca2 Remove git submodules, so that git clone of Wekan repo works now on Windows. Closes #977 2017-06-23 18:16:34 +03:00
Lauri Ojansivu a8c578ac35 Add package-lock.json to .gitignore. 2017-06-23 18:12:32 +03:00
Lauri Ojansivu 015d0fa12d Removing submodules. Closes #977 2017-06-23 17:44:39 +03:00
Lauri Ojansivu cc7475573c Removing submodules. Closes #977 2017-06-23 17:41:37 +03:00
Lauri Ojansivu 3c0df2dd64 Trying to fix fibers on Dockerfile. 2017-06-23 17:25:18 +03:00
Lauri Ojansivu f0f27d1b95 Remove submodules and clone them instead, only latest history and one branch. Closes #977 2017-06-23 17:17:02 +03:00
Lauri Ojansivu 5ef594a7d3 Try again to fix fibers variable. 2017-06-23 16:59:10 +03:00
Lauri Ojansivu 289eaf5ad2 Revert adding ; because it did not work. Reopens #977 2017-06-23 16:16:27 +03:00
Lauri Ojansivu d94848e4e1 Separate paths with ; so cloning works on Windows. Closes #977 2017-06-23 15:04:35 +03:00
Lauri Ojansivu 865bb9063a Remove extra - from fibers. 2017-06-23 15:01:10 +03:00
Lauri Ojansivu 8e3b287c41 Remove fibers version arg. 2017-06-23 14:43:11 +03:00
Lauri Ojansivu 793a62048b Add back meteor-node-stubs. 2017-06-23 14:23:57 +03:00
Lauri Ojansivu 834ffc7811 Remove meteor-node-stubs. 2017-06-23 13:57:42 +03:00
Lauri Ojansivu 594b908c26 MongoDB to version 3.2.14 2017-06-23 12:00:15 +03:00
Lauri Ojansivu 6df910f2ea Add FIBERS_VERSION declaration. NPM to version 5.0.3. 2017-06-23 11:57:32 +03:00
Lauri Ojansivu b0e67bc961 Use fibers 1.0.15 because 2.0.0 is broken. 2017-06-23 11:51:43 +03:00
Lauri Ojansivu 86e2744c24 Use fibers 1.0.15 because 2.0.0 is broken. 2017-06-23 11:49:17 +03:00
Lauri Ojansivu e560a0bc9d Fix Case-sensitive email handling. Thanks to nztqa ! Closes #675 2017-06-23 10:12:36 +03:00
Lauri Ojansivu 728535a0e9 Fix Case-sensitive email handling. Thanks to nztqa ! Closes #675 2017-06-23 10:10:20 +03:00
Lauri Ojansivu ba0b91f141 Merge branch 'GhassenRjab-fix-trello-import' into devel
Fix importing Trello board: Attribute correct members to their comments.
Thanks to GhassenRjab ! Closes #903
2017-06-23 00:59:40 +03:00
Lauri Ojansivu 3e7517e29d Fix importing Trello board: Attribute correct members to their comments. Thanks to GhassenRjab ! Closes #903 2017-06-23 00:59:13 +03:00
Ghassen Rjab 8b6b065462 Fix importing Trello board
Attribute correct members to their comments
2017-06-22 22:09:40 +01:00
Lauri Ojansivu 04577cfdf3 Update translations. 2017-06-22 21:16:30 +03:00
Lauri Ojansivu 9ae03f3056 v0.24 2017-06-21 10:33:27 +03:00
Lauri Ojansivu 32d9c3d714 v0.24 2017-06-21 10:31:01 +03:00
Lauri Ojansivu de98230db3 Update translations. 2017-06-21 09:57:20 +03:00
Lauri Ojansivu 060f11758d Merge branch 'nztqa-fix-admin_panel_link' into devel
Fix Admin Panel link available to all users, only link is hidden. Thanks to nztqa ! Closes #1048
2017-06-21 09:47:47 +03:00
Lauri Ojansivu 974fca2171 Fix Admin Panel link available to all users, only link is hidden. Thanks to nztqa ! Closes #1048 2017-06-21 09:47:12 +03:00
nztqa b858b7d341 Add make sure authority exists 2017-06-21 11:28:00 +09:00
Lauri Ojansivu 848d3e076e Update translations. 2017-06-20 16:28:33 +03:00
Lauri Ojansivu 59b8d35386 Merge branch 'nztqa-fix-filterreset' into devel
Fix filter reset on moving between starred boards. Thanks to nztqa !
2017-06-20 11:51:46 +03:00
Lauri Ojansivu 70233865d7 Fix filter reset on moving between starred boards. Thanks to nztqa ! 2017-06-20 11:44:59 +03:00
nztqa 37effd8324 Fix filter reset on moving between starred boards. 2017-06-20 16:52:58 +09:00
Lauri Ojansivu 82d289e899 Update translations. 2017-06-20 10:01:09 +03:00
Lauri Ojansivu 732914c71f Merge branch 'GhassenRjab-edit-card-desc' into devel
Edit card description with invalid markdown. Thanks to GhassenRjab ! Closes #1039
2017-06-20 09:31:13 +03:00
Lauri Ojansivu d934401379 Edit card description with invalid markdown. Thanks to GhassenRjab ! Closes #1039 2017-06-20 09:30:43 +03:00
Ghassen Rjab d8cc8167de Edit card description with invalid markdown
The viewer has a minimum height of 18px (at least a single line) so the anchor can still be clickable even there is no text shown
2017-06-20 01:25:49 +01:00
Lauri Ojansivu beb59414c7 Update translations. 2017-06-19 23:54:32 +03:00
Lauri Ojansivu e796f6d195 Fix login url in invitation email. Closes #993 2017-06-19 23:41:29 +03:00
Lauri Ojansivu f2b4ccd043 Update translations. 2017-06-19 21:32:13 +03:00
Lauri Ojansivu 3ed496cef6 Save to be translatable in Admin Panel SMTP settings. 2017-06-19 13:06:03 +03:00
Lauri Ojansivu aa459f0142 Initials to be translatable. 2017-06-19 12:55:18 +03:00
Lauri Ojansivu 47a0fe1d03 Update translations. 2017-06-19 11:13:41 +03:00
Lauri Ojansivu c9c6682299 Archived boards to be translatable. 2017-06-19 11:06:36 +03:00
Lauri Ojansivu b61034048f Merge branch 'GhassenRjab-add-breton-label' into devel
Add Breton language name. Thanks to GhassenRjab ! Closes #1002
2017-06-19 10:06:20 +03:00
Lauri Ojansivu ebb7d38a6a Add Breton language name. Thanks to GhassenRjab ! Closes #1002 2017-06-19 10:05:33 +03:00
Ghassen Rjab 80d73b9910 Add Breton label 2017-06-19 01:03:08 +01:00
Lauri Ojansivu b98411a441 Remove es-ES translation that is not used. 2017-06-19 02:29:56 +03:00
Lauri Ojansivu 2522398233 Rename translation file to get Norsk bokmål to show correctly in languages. 2017-06-19 02:09:22 +03:00
Lauri Ojansivu 183142a8b4 Merge branch 'GhassenRjab-sort-languges-tr' into devel
Sort languages by their translated names. Thanks to GhassenRjab !
2017-06-19 01:45:06 +03:00
Lauri Ojansivu 9b9b208169 Sort languages by their translated names. Thanks to GhassenRjab ! 2017-06-19 01:44:37 +03:00
Ghassen Rjab a9dde296bf Sort available languages by their translated names 2017-06-18 17:21:46 +01:00
Lauri Ojansivu cdddf42847 Fix typo. 2017-06-17 21:31:02 +03:00
Lauri Ojansivu b08dccf7d4 Merge branch 'GhassenRjab-devel' into devel
Fix "W" shortcut binding. Thanks to GhassenRjab ! Closes #1064
2017-06-17 17:49:49 +03:00
Lauri Ojansivu 9b64215b64 Fix "W" shortcut binding. Thanks to GhassenRjab ! Closes #1064 2017-06-17 17:49:22 +03:00
Lauri Ojansivu 19ddf42859 Merge https://github.com/GhassenRjab/wekan into GhassenRjab-devel
Fix "W" shortcut binding. Thanks to GhassenRjab ! Closes #1064
2017-06-17 17:43:25 +03:00
Lauri Ojansivu 83d14b910c Update translations. 2017-06-17 17:28:09 +03:00
Lauri Ojansivu b5c22e2a8a Merge branch 'GhassenRjab-fix-export-path' into devel
Fix Export Wekan board. Thanks to GhassenRjab ! Closes #1061
2017-06-17 17:19:04 +03:00
Lauri Ojansivu 012ee672d3 Fix Export Wekan board. Thanks to GhassenRjab ! 2017-06-17 17:18:44 +03:00
Ghassen Rjab ed22866231 Fix Travis CI errors, again 2017-06-17 05:22:21 +03:00
Ghassen Rjab d0d28749f1 Fix Travis CI errors 2017-06-17 00:06:07 +03:00
Ghassen Rjab f4b4c6d1ee Fix export path 2017-06-16 23:13:39 +03:00
Ghassen Rjab 9b5c283892 Fix "W" shortcut binding 2017-06-16 20:55:15 +03:00
Lauri Ojansivu 58b0be8211 Add translation: en-GB 2017-06-13 21:45:23 +03:00
Lauri Ojansivu fb1b61eda6 Re-enable Export Wekan board. Thanks to nebulade ! 2017-06-12 11:07:02 +03:00
Lauri Ojansivu 19cb92bd88 Merge branch 'cloudron-io-devel' into devel
Re-enable the export feature. Thanks to nebulade !
2017-06-12 10:57:16 +03:00
Johannes Zellner 3d45c9610f Reenable the export feature
Fixes #1055
2017-06-12 09:30:06 +02:00
Lauri Ojansivu 76f6f8caa4 Merge branch 'nztqa-delete-cards' into devel
When deleting list, delete list's cards too. Thanks to nztqa !
2017-06-07 13:28:36 +03:00
Lauri Ojansivu 9481264283 When deleting list, delete list's cards too. Thanks to nztqa ! 2017-06-07 13:28:03 +03:00
nztqa 54f3cf9429 Add delete the card belonging to when deleting the list 2017-06-07 14:32:38 +09:00
Lauri Ojansivu 9a6b4278d3 Update translations. 2017-06-06 09:54:06 +03:00
Lauri Ojansivu 8ade0988eb Merge branch 'nztqa-fix-dragboard' into devel
Fix IE 11 Drag Board To Scroll. Thanks to tztqa !
2017-06-06 09:46:44 +03:00
Lauri Ojansivu c3505d13bd Fix IE 11 Drag Board To Scroll. Thanks to nztqa ! 2017-06-06 09:46:16 +03:00
nztqa 060278f9b8 Fix Drag Board To Scroll 2017-06-06 14:57:40 +09:00
Lauri Ojansivu a1c0401cb4 Update translations. 2017-06-04 13:04:29 +03:00
Lauri Ojansivu f0cc185a47 Fix lint errors. 2017-06-02 19:24:17 +03:00
Lauri Ojansivu bee9bf2226 Fix lint errors. 2017-06-02 19:18:31 +03:00
Lauri Ojansivu 3b6c1baff3 Fix some lint errors. 2017-06-02 18:48:04 +03:00
Lauri Ojansivu 89537700e3 Merge branch 'BaobabCoder-devel' into devel
Change the way to delete a list (card-like). Closes #1023
2017-06-02 17:42:22 +03:00
Lauri Ojansivu 59c3cd3956 Change the way to delete a list (card-like). Closes #1023 2017-06-02 17:41:30 +03:00
Lauri Ojansivu fc9c27d150 Merge branch 'devel' of https://github.com/BaobabCoder/wekan into BaobabCoder-devel 2017-06-02 17:38:01 +03:00
BaobabCoder e33156dcc4 Remove translation for transifex 2017-06-02 14:39:12 +02:00
BaobabCoder 15b428893f Change text : delete instead of remove 2017-06-02 10:55:22 +02:00
BaobabCoder de5589a987 Fix missing popup title 2017-06-02 10:45:01 +02:00
BaobabCoder 5b0da6cb3a Change the way to remove a list (card like) 2017-06-02 10:29:48 +02:00
Lauri Ojansivu 390830cba5 Update translations. 2017-06-01 23:48:57 +03:00
Lauri Ojansivu 9ed806a86c Remove bountysource while setting it up. Add OpenHub stats. 2017-05-29 11:16:41 +03:00
Lauri Ojansivu 28c348342d Change bounty url 2017-05-29 10:34:05 +03:00
Lauri Ojansivu 6877836ad6 Add bounty. 2017-05-29 10:29:49 +03:00
Lauri Ojansivu 132a348486 Wekan release v0.23 2017-05-21 11:04:21 +03:00
Lauri Ojansivu 3507eed620 Update translations. 2017-05-19 22:31:46 +03:00
Lauri Ojansivu 371a2dc84d Add vanila chat back, part of community is there. 2017-05-19 01:20:07 +03:00
Lauri Ojansivu 200cc1d97a Change chat to Freenode IRC channel wekan. 2017-05-18 20:38:42 +03:00
Lauri Ojansivu dda8ff9796 Upgrade npm to v4.6.1 2017-05-18 10:56:47 +03:00
Lauri Ojansivu 0333d4b75b Authorization improvements etc to REST API. Thanks to mayjs ! 2017-05-18 10:51:18 +03:00
Lauri Ojansivu 1ed7756d6c Merge branch 'mayjs-rest-api-pr' into devel 2017-05-18 10:45:26 +03:00
Lauri Ojansivu 8de6461cf7 Merge branch 'rest-api-pr' of https://github.com/mayjs/wekan into mayjs-rest-api-pr 2017-05-18 10:31:47 +03:00
Lauri Ojansivu fe94ab0dde Fix IE11 problem when closing cards, sidebar etc. Thanks to nztqa ! Closes #806 2017-05-18 10:29:38 +03:00
Lauri Ojansivu 0092a73e86 Merge branch 'nztqa-disable_link' into devel 2017-05-18 10:22:29 +03:00
nztqa 0e7c79bd1a Fix disable a href=“#” link 2017-05-17 11:48:49 +09:00
mayjs e3fab53806 Fixed a typo.. 2017-05-16 17:35:14 +02:00
mayjs 058aabff68 Implemented the change of /api/user/boards as proposed by huneau 2017-05-16 10:52:55 +02:00
mayjs 4ff906bd7b Revert "Added my local test http file to .gitignore"
This reverts commit 5be30a2cd8.
2017-05-15 22:35:53 +02:00
mayjs 25b26657da Fixed eslint errors 2017-05-15 22:10:46 +02:00
mayjs c59891d44b Added readonly user access to cards 2017-05-15 21:41:21 +02:00
mayjs cb99fc582e Modified access to GET /api/boards/:boardId/lists/:listId 2017-05-15 21:06:52 +02:00
mayjs 066593f9c3 Modified access to GET /api/boards/:boardId/lists 2017-05-15 21:03:42 +02:00
mayjs 1e8d9f02f3 Extracted board access check function 2017-05-15 21:02:31 +02:00
mayjs 95e2025ff9 Changed GET /api/boards/:id to allow access by the normally also allowed users. 2017-05-15 19:43:53 +02:00
mayjs ef6f2e8d62 Added a simple authorization function 2017-05-15 19:43:15 +02:00
mayjs 1bdc28bf9c Fixed a typo and removed an old todo comment 2017-05-15 19:20:55 +02:00
mayjs 452901d3b1 Changed /api/user/boards to only check if the user is logged in 2017-05-15 19:20:37 +02:00
mayjs 158f19b67c let -> const 2017-05-15 18:45:24 +02:00
mayjs fa928956c2 Added an endpoint to get the user referenced by the given token 2017-05-15 18:44:54 +02:00
mayjs 609a8894ec Added a non restrictive authentication function 2017-05-15 18:40:45 +02:00
mayjs adc6a45185 Removed old debug output 2017-05-15 18:31:10 +02:00
mayjs a472986d0e Fixed the errors existing in /api/user/boards 2017-05-15 18:20:51 +02:00
mayjs 5be30a2cd8 Added my local test http file to .gitignore 2017-05-15 18:20:07 +02:00
Lauri Ojansivu 6147bfac82 Travis badge to devel branch. 2017-05-15 18:46:05 +03:00
Johannes May 0cf0f20f9d Added /api/user/boards 2017-05-13 22:56:26 +02:00
Lauri Ojansivu e285632d9e Move Platforms, Features and Integrations to wiki. 2017-05-13 15:51:11 +03:00
Lauri Ojansivu 89e36ab9aa Update translations. 2017-05-13 13:51:39 +03:00
Lauri Ojansivu ada9478ed7 Add IE 11 support in unicode filename downloads. Thanks to nztqa ! 2017-05-13 13:38:59 +03:00
Lauri Ojansivu 70ca6fdec9 Add support for IE11 in fix-download-unicode. 2017-05-13 13:31:42 +03:00
Lauri Ojansivu ffd704b0cf Add checklist, card comment and token authentication to REST API. Remove here1 false messages from console when starting Wekan. Thanks to huneau ! 2017-05-13 13:26:06 +03:00
Lauri Ojansivu 1c3551201a Merge branch 'huneau-meteor-1.4-RESTAPI' into devel 2017-05-13 12:51:44 +03:00
huneau romain c0ddc89f21 add Autentication to global var 2017-05-11 12:30:30 +02:00
huneau romain b5271e5346 add token authentication, only admin can use api 2017-05-11 12:15:02 +02:00
huneau romain 548172949a replace console.log by winston logger 2017-05-10 16:00:08 +02:00
huneau romain d9c0825d5f add rest api for checklist and card comment 2017-05-10 15:59:06 +02:00
Lauri Ojansivu 8267b5a01c Wekan release v0.22 2017-05-07 23:25:20 +03:00
Lauri Ojansivu bdb2057504 Fix Dockerfile build error that stopped on linting checks. 2017-05-07 22:44:57 +03:00
Lauri Ojansivu 69768dc334 Fix permissions on Dockerfile. 2017-05-07 22:12:14 +03:00
Lauri Ojansivu 5831715bca Reorder installing to be more logical. 2017-05-07 22:04:29 +03:00
Lauri Ojansivu fd6d93a5c9 Update translations. 2017-05-07 22:02:21 +03:00
Lauri Ojansivu 40072cd136 Fix: Download file(unicode filename) cause crash with exception. Thanks to yatusiter ! 2017-05-07 21:55:18 +03:00
Lauri Ojansivu f88d68a9c3 Fix: Download file(unicode filename) cause crash with exception. Closes #784 2017-05-07 21:51:11 +03:00
Lauri Ojansivu dd898f4033 Wekan release v0.21 2017-05-07 15:14:44 +03:00
Lauri Ojansivu 961f8ae3fb Wekan release v0.20 2017-05-07 15:01:54 +03:00
Lauri Ojansivu c4e2f79ddf Upgrade to latest packages. 2017-05-07 14:20:51 +03:00
Lauri Ojansivu 4e27e975be Wekan release v0.19 2017-05-06 22:38:39 +03:00
Lauri Ojansivu 4cad6c7607 Wekan release v0.19 2017-05-06 22:32:09 +03:00
Lauri Ojansivu 3287d15380 Update translations. 2017-05-06 21:50:34 +03:00
Lauri Ojansivu 1aefe0ce61 Try other key servers if ha.pool.sks-keyservers.net is unreachable. Closes #1029 2017-05-06 21:39:23 +03:00
Lauri Ojansivu f7ca3846f0 Update translations. 2017-05-06 09:25:35 +03:00
Lauri Ojansivu 357808ff8a Changed to more descriptive text that I think what it means at models/users.js 2017-05-06 09:17:05 +03:00
Lauri Ojansivu 3e98e8c9fb Fix bson error on Docker. Closes #1009 2017-05-06 01:17:02 +03:00
Lauri Ojansivu 5752383d3c Revert code that broke changing language. 2017-05-06 00:30:43 +03:00
Lauri Ojansivu 6c26dad562 Update translations. 2017-05-05 22:14:15 +03:00
Lauri Ojansivu 219ed89f62 Update translations. 2017-05-04 21:41:29 +03:00
Lauri Ojansivu 96ddb9bfb2 Merge pull request #1017 from stephenmoloney/devel-local
changes to travis.yml.
2017-04-28 14:43:56 +03:00
Stephen Moloney c5a738ba0a gcc already newer version since using trusty now and not precise 2017-04-28 11:05:28 +01:00
Stephen Moloney 6d45836b4d add new ARGS to docker-compose 2017-04-28 10:59:38 +01:00
Stephen Moloney 3154e8729b changes to travis.yml.
- Add gcc-4.9 to travis host.
- namespace travis variables as seem to conflict with docker env.
- set versions on travis.
- run npm tests again.
- slight readme mod for docker
2017-04-28 10:54:29 +01:00
Lauri Ojansivu c4835847c0 Merge pull request #1016 from stephenmoloney/devel-local
make METEOR_EDGE optional. Fix node_gyp bug in docker build.
2017-04-28 03:19:22 +03:00
Stephen Moloney 4818199da7 temp block npm install 2017-04-27 23:29:03 +01:00
Stephen Moloney 162f8ab361 make METEOR_EDGE optional. Fix node_gyp bug in docker build.
- make METEOR_EDGE optional.
- Fix node_gyp bug in docker build.
- Cannot fix `npm install` because this
runs in the travis container and that is running
on an old ubuntu 12.0 - some way to get a newer version?
- remove npm install for now.
- possibly run tests against docker container
as alternative.
2017-04-27 21:58:48 +01:00
Lauri Ojansivu 72d1d74869 Add latest changes. 2017-04-27 23:07:37 +03:00
Lauri Ojansivu 4178ead186 Update METEOR_EDGE version now that EXDEV fix has been merged. Also NPM update. 2017-04-27 22:47:36 +03:00
Lauri Ojansivu 19783cd757 Update translations. 2017-04-27 22:02:52 +03:00
Lauri Ojansivu 96fbb832bb Node version to 4.8.1 to solve 100% CPU issue. Thanks to johnniesong ! 2017-04-27 21:57:41 +03:00
Lauri Ojansivu 71b951a75b Merge branch 'master' into devel 2017-04-27 21:09:56 +03:00
Lauri Ojansivu e2628dea93 Merge branch 'devel' into meteor-1.4 2017-04-27 21:08:51 +03:00
Lauri Ojansivu f8cd29ea24 Updating meteor dependencies, because wekan still seems to work. 2017-04-27 21:04:31 +03:00
Lauri Ojansivu fc113852d3 Add jsonroutes and winston. 2017-04-27 20:52:34 +03:00
Lauri Ojansivu 0319bcf7bb REST API - Meteor 1.4 - first step issue 2017-04-27 20:49:24 +03:00
Lauri Ojansivu a99218e2c7 Merge branch 'huneau-meteor-1.4-LOGGER' into meteor-1.4 2017-04-27 20:40:33 +03:00
Lauri Ojansivu 7a94824084 Add some packages. 2017-04-27 20:40:07 +03:00
Lauri Ojansivu 0110e933a5 Merge branch 'meteor-1.4-LOGGER' of https://github.com/huneau/wekan into huneau-meteor-1.4-LOGGER 2017-04-27 19:39:13 +03:00
Lauri Ojansivu caee8826d6 Merge branch 'devel' 2017-04-25 23:18:39 +03:00
Lauri Ojansivu 79a9170fa3 isCommentOnly false fix for Trello import. Thanks to rhelsing ! 2017-04-25 23:18:26 +03:00
Lauri Ojansivu 5c429816c1 isCommentOnly false fix for Trello import. Thanks to rhelsing ! 2017-04-25 23:16:27 +03:00
Lauri Ojansivu dc8c59dcbe isCommentOnly false fix for Trello import. Thanks to rhelsing ! 2017-04-25 23:12:10 +03:00
Lauri Ojansivu 44f3596b9e Merge branch 'devel' 2017-04-25 20:33:43 +03:00
Lauri Ojansivu 6095002faf Merge branch 'rhelsing-import-comment-fixes' into devel 2017-04-25 20:33:14 +03:00
Lauri Ojansivu 8f55122306 Merge branch 'import-comment-fixes' of https://github.com/rhelsing/wekan into rhelsing-import-comment-fixes 2017-04-25 20:32:54 +03:00
Lauri Ojansivu 1d126d20f7 Merge branch 'devel' 2017-04-25 20:21:56 +03:00
Lauri Ojansivu e25ea28ba0 Update translations. 2017-04-25 20:21:36 +03:00
Lauri Ojansivu ecfb838644 Update translations. 2017-04-25 20:20:08 +03:00
Lauri Ojansivu dbb290f154 Change size from Kb to KB. Fixes #1012 2017-04-25 20:13:18 +03:00
huneau romain 34089b1222 toggle no-unused-vars to warn 2017-04-19 16:51:26 +02:00
huneau romain 00a357cd70 add console, file, and zulip logger on database changes 2017-04-19 16:16:31 +02:00
Ryan Helsing 22aa6efa32 add comment false 2017-04-18 13:38:24 -04:00
Lauri Ojansivu 165e2cc8ff Merge branch 'devel' 2017-04-16 14:29:13 +03:00
Lauri Ojansivu 41bec75886 Update translations. 2017-04-16 14:28:44 +03:00
Lauri Ojansivu 4ecc16617c Update translations. 2017-04-16 14:27:14 +03:00
Lauri Ojansivu b54f24d218 Add: Binary package for debian and devuan. Thanks to soohwa ! 2017-04-16 12:03:55 +03:00
Lauri Ojansivu c9bd695a84 Merge branch 'devel' 2017-04-16 12:03:17 +03:00
Lauri Ojansivu 9122b7d310 Add: Binary package for debian and devuan. Thanks to soohwa ! 2017-04-16 12:02:58 +03:00
Lauri Ojansivu e2fe80e352 Merge pull request #992 from stephenmoloney/met1.4
Met1.4
2017-04-14 01:44:51 +03:00
Lauri Ojansivu 2ef0f5297a Merge branch 'devel' 2017-04-13 17:06:57 +03:00
Lauri Ojansivu 3dd8e63ec4 Update translations. 2017-04-13 17:06:40 +03:00
Lauri Ojansivu 2df9e1ba1a Update translations. 2017-04-13 17:05:30 +03:00
Lauri Ojansivu 2b176aeac1 Merge branch 'devel' 2017-04-13 10:25:33 +03:00
Lauri Ojansivu 2bb5a4cd26 Better translation. 2017-04-13 10:25:18 +03:00
Lauri Ojansivu 0c8cfe2e0b Better translation. 2017-04-13 10:22:54 +03:00
Stephen Moloney 1b5a5bba1d rc.6 seems to work only for now. 2017-04-10 11:49:56 +01:00
Stephen Moloney 31ce8bb1bf MAKE release candidates and betas specifiable in dockerbuild 2017-04-10 11:27:56 +01:00
Stephen Moloney 14208dca1d seems meteor 1.4.4.1 does not include fix for EXDEV problem 2017-04-10 11:26:17 +01:00
Stephen Moloney 65ba52b177 meteor has released 1.4.4.1 2017-04-10 11:13:06 +01:00
Stephen Moloney b21534a6c4 update debian version issue 988 2017-04-10 11:02:50 +01:00
Lauri Ojansivu 4f5c5a952e Move more content to wiki. 2017-04-08 13:58:34 +03:00
Lauri Ojansivu b9a5de2d88 Fix typos. 2017-04-08 13:58:04 +03:00
Lauri Ojansivu 81c14fabb5 Fix typo. 2017-04-08 13:57:11 +03:00
Lauri Ojansivu e606438c33 Fix typo. 2017-04-08 13:55:29 +03:00
Lauri Ojansivu 2f10a8f7eb Fix typo. 2017-04-08 13:54:10 +03:00
Lauri Ojansivu 11b91ae00d Move more content to wiki. 2017-04-08 13:53:16 +03:00
Lauri Ojansivu 6cbf046aed Move more content to wiki. 2017-04-08 13:52:01 +03:00
Lauri Ojansivu e6986e138d Meteor 1.4 and Node v4 based Docker Compose scripts. Thatnks to brylie and stephenmoloney ! 2017-04-06 19:39:09 +03:00
Lauri Ojansivu 6ff548b1c7 Meteor 1.4 and Node v4 based Docker Compose scripts. Thatnks to brylien and stephenmoloney ! 2017-04-06 19:38:34 +03:00
Lauri Ojansivu 8e595c41e7 Use Meteor 1.4 and Node v4 based Docker image. 2017-04-06 19:02:09 +03:00
Lauri Ojansivu 510fbf0635 Use Meteor 1.4 and Node v4 based Docker image. 2017-04-06 18:59:43 +03:00
Lauri Ojansivu 3c91a1750f Merge pull request #982 from stephenmoloney/met1.4
Met1.4
2017-04-06 17:12:26 +03:00
Stephen Moloney 88d3f38d53 dangling commas error 2017-04-06 10:14:54 +01:00
Stephen Moloney a314d608a2 remove tailing commas 2017-04-06 09:25:57 +01:00
Lauri Ojansivu 40197ed981 Merge pull request #981 from stephenmoloney/met1.4
Met1.4
2017-04-06 01:20:01 +03:00
Stephen Moloney 6443ea160c rebuild 2017-04-05 23:02:19 +01:00
Stephen Moloney 377380d15f no tests - remove 2017-04-05 22:29:18 +01:00
Stephen Moloney 4e7f56ac74 Fix dockerbuild and modify travis 2017-04-05 22:05:25 +01:00
Lauri Ojansivu 31afd2b6a3 Update translations. 2017-04-05 22:13:06 +03:00
Lauri Ojansivu 369d5c4332 Update translations. 2017-04-05 22:12:35 +03:00
Lauri Ojansivu fd2057e107 Move Meteor 1.4 to it's own branch, and devel back to Meteor 1.3 2017-04-05 21:37:15 +03:00
Stephen Moloney 5166395af1 Merge branch 'devel' of https://github.com/wekan/wekan into devel 2017-04-04 21:54:45 +01:00
Stephen Moloney 0afe007d78 change versions for dockerbuild 2017-04-04 21:51:55 +01:00
Lauri Ojansivu 30fde1a406 Merge pull request #976 from dwrensha/sandstorm-is-comment-only
fix updateUserPermissions() on Sandstorm
2017-04-04 18:46:44 +03:00
David Renshaw 6db86489ab fix updateUserPermissions() on Sandstorm
The new isCommentOnly property needs to be set when
Sandstorm updates user permissions, because otherwise
a schema validation error occurs and users never get
added as members of boards.
2017-04-04 10:37:29 -04:00
Lauri Ojansivu 656e7e6172 Merge pull request #957 from brylie/feature/meteor-1.4
meteor update all packages
2017-04-04 13:25:32 +03:00
Lauri Ojansivu b242f49d7c Merge branch 'Zokormazo-admin' into devel
Set first user as admin, it there is no existing
users and Wekan is not running at Sandstorm.

Fixes #924
2017-04-02 17:44:04 +03:00
Lauri Ojansivu 11bf182b50 Add feature: Set first user as Admin if not running at Sandstorm. Fixes #924 2017-04-02 17:43:40 +03:00
Lauri Ojansivu dd40bcf233 Merge branch 'admin' of https://github.com/Zokormazo/wekan into Zokormazo-admin
Add Feature: Set admin on first run

Fixes #924
2017-04-02 17:36:48 +03:00
Julen Landa Alustiza 28a1dd677c First user is admin only if not running in sandstorm 2017-04-02 16:29:51 +02:00
Lauri Ojansivu c42c81b60a v0.18 Wekan release. 2017-04-02 17:04:17 +03:00
Lauri Ojansivu 90c53807b4 Update translations. 2017-04-02 16:43:02 +03:00
Lauri Ojansivu ac196c89c4 Fix typo. 2017-04-02 15:17:46 +03:00
Lauri Ojansivu 97f0f96743 Move Sandstorm to separate paragraph. 2017-04-02 15:16:35 +03:00
Lauri Ojansivu 12d4ed9171 Move features and integrations to wiki. 2017-04-02 15:12:17 +03:00
Julen Landa Alustiza 1218e114be Add isAdmin to user Schema 2017-04-02 12:55:13 +02:00
Lauri Ojansivu c58cb9eddf Update translations. 2017-04-02 13:23:21 +03:00
Lauri Ojansivu 1fa9fe372b Add: Fix email settings loaging. Thanks to Zokormazo ! 2017-04-02 13:19:41 +03:00
Lauri Ojansivu 5bf43319c9 Merge branch 'Zokormazo-email' into devel
MAIL_URL was overriden with database info all the time.
Now if MAIL_URL exists is not overwritten and if neither MAIL_URL nor
exists valid admin panel data MAIL_URL is not set.
MAIL_FROM was ignored. Same behaviour, env variable has bigger priority
than database configuration.
On both cases, althrought environment variable is set, updating admin-panel
mail settings will load new info and ignore the environment variable.
Remove some code that is not needed anymore.

This fixes #951, fixes #948, and fixes #937
2017-04-02 13:13:33 +03:00
Julen Landa Alustiza dfeeec308a Fix email settings loading:
MAIL_URL was overriden with database info all the time.
Now if MAIL_URL exists is not overwritten and if neither MAIL_URL nor
exists valid admin panel data MAIL_URL is not set.
MAIL_FROM was ignored. Same behaviour, env variable has bigger priority
than database configuration.
On both cases, althrought environment variable is set, updating admin-panel
mail settings will load new info and ignore the environment variable.
Remove some code that is not needed anymore
2017-04-01 21:46:09 +02:00
Lauri Ojansivu 823aea497b Fix typo. 2017-03-31 13:22:12 +03:00
Lauri Ojansivu 45de749c6a Add link to Enable Admin Panel. 2017-03-31 13:20:07 +03:00
Lauri Ojansivu ab66475a2c Add link to Import/Export MongoDB data to/from Docker container. 2017-03-31 13:17:04 +03:00
Lauri Ojansivu 69d7c0102e Add alternative Docker image while current one is broken. 2017-03-31 13:11:14 +03:00
Lauri Ojansivu af72f2d4fb Add translation: Basque (eu) 2017-03-31 11:57:20 +03:00
Lauri Ojansivu 2f054234da Update translations. 2017-03-31 11:13:57 +03:00
Lauri Ojansivu f9fe4a1c0b Add TLS toggle option to smtp configuration. Thanks to Zokormazo ! 2017-03-31 11:05:54 +03:00
Lauri Ojansivu e3aa65b96e Merge branch 'Zokormazo-tls' into devel 2017-03-31 11:03:55 +03:00
Julen Landa Alustiza db2c381c00 Add TLS toggle option to smtp configuration 2017-03-30 19:13:57 +02:00
Brylie Christopher Oxley ebe42b4358 meteor update all packages 2017-03-30 12:29:20 +03:00
Lauri Ojansivu ee6aa7a6b2 Fix typo. 2017-03-30 08:16:45 +03:00
Lauri Ojansivu 5bfa8b6502 Fix: Use navigator language by default instead of English. 2017-03-30 08:15:55 +03:00
Lauri Ojansivu ee06948074 Merge branch 'umbertooo-navigator-preferred-language' into devel 2017-03-30 08:14:05 +03:00
Lauri Ojansivu 3ce4615975 Merge branch 'navigator-preferred-language' of https://github.com/umbertooo/wekan into umbertooo-navigator-preferred-language 2017-03-30 08:06:44 +03:00
Lauri Ojansivu 9d95a7ed4d Merge pull request #952 from rhelsing/comment-hotfix
hotfix to user add isCommentOnly
2017-03-30 07:54:15 +03:00
Ryan Helsing e9bc5eaac5 hotfix to user add 2017-03-29 14:28:04 -04:00
Lauri Ojansivu 4d4bc55991 Merge pull request #946 from stephenmoloney/devel
fix dockerfile
2017-03-28 21:24:29 +03:00
Lauri Ojansivu c1609fb760 Update changelog. 2017-03-28 21:22:26 +03:00
Lauri Ojansivu 61b520617a Update translations. 2017-03-28 21:11:34 +03:00
Stephen Moloney 8045167b6d remove invalid command 2017-03-28 19:08:55 +01:00
Lauri Ojansivu 578619d409 Merge pull request #925 from rhelsing/comment-permissions
Comment permissions
2017-03-28 20:55:02 +03:00
Lauri Ojansivu 0c36f5f4c2 Merge pull request #943 from Zokormazo/smtp
Don't send emails if missing smtp host
2017-03-28 20:52:39 +03:00
Lauri Ojansivu b3cd2f2125 Merge pull request #945 from Serubin/devel
Dockerfile fix for local packages
2017-03-28 20:51:17 +03:00
Lauri Ojansivu 3ccc61957c Merge pull request #942 from stephenmoloney/devel
user high availability key server and update  travis.yml for docker builds
2017-03-28 20:50:42 +03:00
Stephen Moloney 0c11096a57 update travis for a docker build 2017-03-28 18:09:57 +01:00
Serubin b691d4935c Dockerfile fix for local packages 2017-03-28 11:50:05 -04:00
Julen Landa Alustiza 5db786e2dd Don't send emails if missing smtp host 2017-03-28 12:44:36 +02:00
Stephen Moloney 8612b05f52 user high availability key server. sks-keyservers.net/overview-of-pools.php 2017-03-28 09:35:52 +01:00
Lauri Ojansivu ca7be3a162 Update Dockerfile maintainer and npm version. 2017-03-28 09:28:04 +03:00
Lauri Ojansivu c197cabd98 Add registration and invitation fixes. Thanks to lkisme ! 2017-03-28 09:26:30 +03:00
Lauri Ojansivu 6a57d6d2d0 Merge branch 'lkisme-invtn-bug-fix' into devel 2017-03-28 09:20:43 +03:00
Lauri Ojansivu b54e0c8b4f Merge branch 'invtn-bug-fix' of https://github.com/lkisme/wekan into lkisme-invtn-bug-fix 2017-03-28 09:09:16 +03:00
Lauri Ojansivu 8b14221061 Update translations. 2017-03-28 09:06:39 +03:00
Lauri Ojansivu 6c884d35db Remove unused text, no need to translate it anymore. 2017-03-28 08:58:33 +03:00
Lauri Ojansivu 5bde740351 Merge pull request #940 from JamborJan/devel
Add bigger screenshots
2017-03-28 08:43:26 +03:00
JJ 41c314638e Tinified pngs
Tinified pngs with https://tinypng.com/
2017-03-28 07:40:33 +02:00
JJ 664824c931 Add bigger screenshots
According to this conversation: https://oasis.sandstorm.io/grain/mZ6GkpaHjWAyxxKXgwTCG5/b/sandstorm/libreboard/KgLwFJqLmgheFvwRc 2 bigger screenshots added
2017-03-28 07:29:10 +02:00
lkisme f82941550a Remove invitation code if email sending failed, improve registration process with invitation 2017-03-28 00:48:18 +08:00
Lauri Ojansivu feafc46bb5 Release v0.17 2017-03-25 00:20:30 +02:00
Lauri Ojansivu 6ecbbc07bd Remove fixed issue. 2017-03-24 22:32:52 +02:00
Lauri Ojansivu 24e3e92d3e Update urls and upcoming version. 2017-03-24 22:31:59 +02:00
Lauri Ojansivu 9cb80d9273 Update translations. 2017-03-24 22:14:25 +02:00
Lauri Ojansivu 71103d72e8 Tried to fix fonts for #914 , not #707 that was wrong number in previous commit. 2017-03-24 21:50:25 +02:00
Lauri Ojansivu d60cd71e64 Fix fonts. Still looking for better solution for #707 2017-03-24 21:45:03 +02:00
Lauri Ojansivu 16366db2a5 Merge branch 'Serubin-devel' into devel 2017-03-24 21:00:18 +02:00
Lauri Ojansivu 2031d107c4 Fix: Double slash problem on card pop-ups. Closes #785 2017-03-24 20:59:29 +02:00
Lauri Ojansivu a9059201a7 Merge branch 'devel' of https://github.com/Serubin/wekan into Serubin-devel 2017-03-24 20:41:40 +02:00
Lauri Ojansivu cfc2175765 Update urls. 2017-03-24 20:34:11 +02:00
Serubin e088159c2f Eslint will now ignore packages directory. 2017-03-23 00:46:16 -04:00
Serubin 0586593caa Updated flow-router commit. Changed url 2017-03-23 00:22:06 -04:00
Serubin c7f9651236 App env variables 2017-03-22 22:29:54 -04:00
Serubin 92a34ba6a7 Added local dependency for flow-router 2017-03-22 22:23:49 -04:00
Lauri Ojansivu 167e873e13 Update screenshot. 2017-03-22 15:55:24 +02:00
Lauri Ojansivu cd01f84de6 Merge pull request #930 from dwrensha/sandstorm-release-19
update sandstorm metadata for appVersion 19 release
2017-03-21 22:57:12 +02:00
David Renshaw 9b2e039da2 update sandstorm metadata for appVersion 19 release 2017-03-21 16:38:06 -04:00
Lauri Ojansivu a00eb436ff Fix default font so Chinese is shown correctly. Thanks to mo-han ! 2017-03-19 22:52:15 +02:00
Lauri Ojansivu eaa09ea341 Fix default font so Chinese is shown correctly. Closes #914 2017-03-19 22:48:26 +02:00
Ryan Helsing e7fddc2bcb add to omit list 2017-03-19 15:26:19 -04:00
Ryan Helsing 3fbce6dfd2 fix understood syntax 2017-03-19 15:21:06 -04:00
Lauri Ojansivu 0472b98aa4 Fix bug: No need for Array.prototype if using rest operator. Thanks to vuxor ! 2017-03-19 20:04:21 +02:00
Lauri Ojansivu 561448df64 Merge branch 'vuxor-concat-blaze-helper' into devel 2017-03-19 19:53:10 +02:00
Ryan Helsing de10be6a21 comment only working, naive implementation complete 2017-03-18 18:49:39 -04:00
Ryan Helsing ec9498fa62 current progress 2017-03-18 16:01:22 -04:00
Ryan Helsing cf85c9c6cd dont show list options 2017-03-18 15:27:24 -04:00
Ryan Helsing 383daf6f64 cant see add list if comment only 2017-03-18 15:22:40 -04:00
Ryan Helsing e6276271b1 ability to store comment only, actual prevention next 2017-03-18 14:59:28 -04:00
Ryan Helsing 4a0474dfc3 add english desc 2017-03-18 13:44:32 -04:00
Ivan Radeljic 402a2b8f93 No need for Array.prototype if using rest operator 2017-03-16 08:06:41 +01:00
Lauri Ojansivu 7130bfa98a Update changelog. 2017-03-15 01:46:49 +02:00
Lauri Ojansivu 593510ac6a Update translations. 2017-03-15 01:40:35 +02:00
Lauri Ojansivu 862ce27eb9 Set IE compatibility mode to Edge to so that
Wekan board loads correctly.
2017-03-15 01:25:48 +02:00
Lauri Ojansivu 42bdc0e101 v0.13 Wekan release. 2017-03-12 16:33:39 +02:00
Lauri Ojansivu d4c2b9c882 Merge branch 'lkisme-admin-panel' into devel 2017-03-12 16:15:53 +02:00
Lauri Ojansivu 6b1b452c4a Merge branch 'admin-panel' of https://github.com/lkisme/wekan into lkisme-admin-panel 2017-03-12 16:11:33 +02:00
Lauri Ojansivu de396e6c6b Update translations. 2017-03-12 16:03:53 +02:00
lkisme 72c3651be4 Set mail-from to environment immediately after changed,
allow user set a blank username&password pair in SMTP setting.
2017-03-09 23:29:48 +08:00
Lauri Ojansivu a64e9af1d3 Fix typo. 2017-03-05 23:48:51 +02:00
Lauri Ojansivu e3f4bd60d2 v0.12 Wekan release. 2017-03-05 22:42:34 +02:00
Lauri Ojansivu 96a54f9384 Merge branch 'whodafly-checklist-import' into devel 2017-03-05 22:25:47 +02:00
Lauri Ojansivu 53a7ab0496 Merge branch 'checklist-import' of https://github.com/whodafly/wekan into whodafly-checklist-import 2017-03-05 22:12:59 +02:00
Raoul Snyman bc9e093e07 Fix up some linting issues 2017-03-05 13:08:53 -07:00
Raoul Snyman 4414582a35 Close #873 by importing checklists from Trello 2017-03-05 12:56:07 -07:00
Lauri Ojansivu c775da8ccc v0.11.1-rc2 Wekan prerelease. 2017-03-05 21:15:16 +02:00
Lauri Ojansivu c829440bc2 Update Finnish translation. 2017-03-05 20:49:37 +02:00
Lauri Ojansivu 3f4be5e9fa Update translations. 2017-03-05 20:23:24 +02:00
Lauri Ojansivu 44dbe43ac4 Add Admin Panel:
1) Disable Self-Registration and invite users
    2) SMTP settings.
2017-03-05 20:16:12 +02:00
Lauri Ojansivu cbc3c8224f Merge branch 'lkisme-devel' into devel
Add Admin Panel:
1) Disable Self-Registration and invite users
2) SMTP settings.

Adding Admin user in mongo cli:
1) Use database that has wekan data, for example:
use admin;
2) Add Admin rights to some Wekan username:
db.users.update({username:'admin-username-here'},{$set:{isAdmin:true}})

Hiding Admin panel by removing Admin rights:
use admin;
db.settings.remove({});
2017-03-05 19:59:19 +02:00
Lauri Ojansivu 7c9a30d8fe Fix merge conflict. 2017-03-05 19:58:22 +02:00
Lauri Ojansivu 7b68f1901e Invite user with lower case email. Thanks to fmonthel ! 2017-03-05 19:08:10 +02:00
Lauri Ojansivu d61e609977 Merge branch 'fmonthel-devel' into devel
Invite user with lower case email
2017-03-05 19:05:26 +02:00
Florent MONTHEL ad6471d3bd [ENH] Invite user with lower case email 2017-03-04 20:42:25 -05:00
Lauri Ojansivu fd9357a495 Separate platforms and new features 2017-03-02 14:14:29 +02:00
Lauri Ojansivu ba73d31123 Fix typos. 2017-03-02 14:06:09 +02:00
Lauri Ojansivu b18cc761ca Add: Install from source on Windows. Thanks to entrptaher ! 2017-03-02 13:56:37 +02:00
Lauri Ojansivu 2c5bf2756d Removed donations link. 2017-03-02 13:39:40 +02:00
Lauri Ojansivu 5105c34305 Add: Docker environment for Wekan development. Thanks to eemeli ! 2017-03-01 21:02:53 +02:00
Lauri Ojansivu 4c62b32605 Moved fmonthel's cleanup/logstash/stats repos to Wekan GitHub Org. Thanks to fmonthel ! 2017-02-28 14:53:28 +02:00
lkisme 39f2837838 wording change, email sending optimization, add texts to i18n 2017-02-26 21:11:15 +08:00
Lauri Ojansivu 48728bf745 Fix Bug: Orphan documents were created when cards were deleted. Thanks to maulal ! 2017-02-26 10:15:39 +02:00
Lauri Ojansivu 7f978ea677 Merge branch 'maulal-devel' into devel
Fix Bug: orphan documents were created when cards were deleted
2017-02-26 10:10:16 +02:00
lkisme e3c3cc0d8d Make mailServer setting optional 2017-02-26 14:25:29 +08:00
lkisme e441e751d5 remove translation in zh-CN 2017-02-25 11:29:37 +08:00
maulal 06699007c4 Bug: orphan documents were created when cards were deleted 2017-02-25 02:16:00 +01:00
lkisme 1dfb6ef477 Admin panel:
Only invited user can register in strict mode,
Set mail server in admin panel,
Switch strict mode in admin panel,
Invite people to system in admin panel
2017-02-24 22:10:38 +08:00
Lauri Ojansivu 29fdfb9c88 Fix: Only headerb-ar new-boards are auto-starred, not all new boards. Thanks to jLouzado ! 2017-02-22 17:44:04 +02:00
Lauri Ojansivu d45a197695 Merge branch 'jLouzado-bAutoStarBoard' into devel
Only header-bar new-boards are auto-starred
Closes #847
2017-02-22 17:39:10 +02:00
Lauri Ojansivu 3658016435 Merge branch 'bAutoStarBoard' of https://github.com/jLouzado/wekan into jLouzado-bAutoStarBoard
Only header-bar new-boards are auto-starred
2017-02-22 17:30:34 +02:00
Lauri Ojansivu b185b5ef8e Improve performance by adding indexes to MongoDB. Thanks to maulal ! Closes #837 2017-02-22 17:25:16 +02:00
Lauri Ojansivu b4fd6b7004 Merge branch 'maulal-devel' into devel
Improve Wekan performance by adding indexes to MongoDB
2017-02-22 17:14:20 +02:00
Alexis LACROIX 6ca832c02b Improve wekan performance (checklist collection scan) 2017-02-22 17:05:30 +02:00
maulal cd6317cedb Improve wekan performance #837 2017-02-22 17:05:30 +02:00
Joel Louzado b2e950540f changes for lint warnings 2017-02-22 18:59:51 +05:30
Joel Louzado 02e381f694 invoke new component from headerBar 2017-02-22 17:34:57 +05:30
Joel Louzado ac07646749 New component for use in header-bar 2017-02-22 17:33:17 +05:30
Lauri Ojansivu cd70076af2 Add: Wekan changes to Logstash. Thanks to fmonthel ! 2017-02-22 01:30:22 +02:00
Lauri Ojansivu 330aa24995 Update French translation. 2017-02-22 01:18:49 +02:00
Lauri Ojansivu af820e0eb3 Add: Fix typos. Thanks to pra85 ! 2017-02-22 01:10:54 +02:00
Lauri Ojansivu af76b78458 Merge branch 'pra85-patch-2' into devel 2017-02-22 01:08:32 +02:00
Lauri Ojansivu 756c423060 Merge branch 'patch-2' of https://github.com/pra85/wekan into pra85-patch-2 2017-02-22 01:07:10 +02:00
Lauri Ojansivu 2f8a6828f0 Add: Fix bug when removing user from board that generate activity for all cards of the board. 2017-02-22 01:05:57 +02:00
Lauri Ojansivu 816d2bd013 Merge branch 'fmonthel-devel' into devel 2017-02-22 00:58:43 +02:00
Prayag Verma 811cc84bfb Fix typos in Changelog
hierachy ⟶ hierarchy
Replace a with an
intial → initial
2017-02-21 14:17:38 +05:30
Florent MONTHEL a370e6aca3 [BUG] Bug when we're removing user from board that generate activity for all the card of the board 2017-02-21 00:06:11 -05:00
Lauri Ojansivu c8b7e14835 Use node 0.10.48 on Travis CI. 2017-02-20 15:03:03 +02:00
Lauri Ojansivu acf5c496be Merge branch 'jLouzado-bMenuToolTip' into devel 2017-02-20 14:56:17 +02:00
Lauri Ojansivu ad374f3886 Merge branch 'bMenuToolTip' of https://github.com/jLouzado/wekan into jLouzado-bMenuToolTip 2017-02-20 13:52:02 +02:00
Joel Louzado 97039cbafd to remove 'multiple attributes' error 2017-02-20 13:21:23 +05:30
Lauri Ojansivu 9fbce31beb Add new translation: Norwegian. 2017-02-19 14:34:27 +02:00
Lauri Ojansivu 902027215f Add new translation: Thai. 2017-02-19 14:23:02 +02:00
Lauri Ojansivu 4c1eb027c1 Fix file permissions. 2017-02-19 14:01:31 +02:00
Lauri Ojansivu 66718b846c Update translations. 2017-02-19 13:58:16 +02:00
Lauri Ojansivu 5b3db2dd17 Add: Tooltip for board menu and sidebar buttons, thanks to jLouzado. 2017-02-19 13:53:38 +02:00
Lauri Ojansivu 82b7ab312a Merge pull request #845 from jLouzado/bMenuToolTip
B menu tool tip
2017-02-19 13:45:37 +02:00
Lauri Ojansivu 30e246386b Shortened link. 2017-02-19 11:43:29 +02:00
Lauri Ojansivu a6b8001f36 Add link to wekan-mongodb repo. 2017-02-19 11:41:34 +02:00
Lauri Ojansivu bb3cb66d83 Fix typos. 2017-02-19 08:37:35 +02:00
Lauri Ojansivu 2c479eabd7 Shortened link. 2017-02-19 08:36:31 +02:00
Lauri Ojansivu eb7b15a12c Add Wekan database cleanup script, Thanks to fmonthel ! 2017-02-19 08:32:54 +02:00
Joel Louzado 46d19af6d9 removed trailing-whitespace 2017-02-15 21:34:52 +05:30
Joel Louzado 7393818fc0 Added dynamic tooltip for sidebar tongue 2017-02-15 21:30:03 +05:30
Joel Louzado be9adfaad4 Added tooltip to MenuBoard button 2017-02-15 21:08:30 +05:30
Lauri Ojansivu 81de7bceec Update changelog. 2017-02-13 18:33:42 +02:00
Lauri Ojansivu e603362067 Merge pull request #835 from viossat/fix-dockerfile-expose
Dockerfile: Add EXPOSE
2017-02-13 18:23:59 +02:00
Lauri Ojansivu 8f61e498ff Merge pull request #836 from vuxor/devel
Fix typo
2017-02-13 18:23:23 +02:00
Lauri Ojansivu b62e648379 Add: PostgreSQL read-only mirroring using dockerhub images. 2017-02-13 18:17:03 +02:00
Ivan Radeljic 3737cb30dd Fix typo 2017-02-13 14:11:32 +01:00
Lauri Ojansivu 2b606499b8 Fix typos. 2017-02-12 17:13:48 +02:00
Lauri Ojansivu 0768bd6e32 Make Due Date layout nicer on minicard. Thanks to whittssg2! 2017-02-11 23:05:03 +02:00
Lauri Ojansivu d6028b90cd Make Due Date layout nicer on minicard. Thanks to whittssg2! 2017-02-11 23:01:50 +02:00
Mathieu Viossat ef3ae31bdd Dockerfile: Add EXPOSE 2017-02-11 20:34:01 +00:00
Lauri Ojansivu c7f30c96fc Update screenshot. 2017-02-11 11:32:07 +02:00
Lauri Ojansivu 0b1b6e2c4b Fix typo. 2017-02-11 00:42:43 +02:00
Lauri Ojansivu 7f77351157 Moved build status to top of readme. 2017-02-11 00:38:57 +02:00
Lauri Ojansivu 4b7f6b2b8e Added numbering plans for next versions. 2017-02-11 00:29:49 +02:00
Lauri Ojansivu dcad6bd550 v1.11.1-rc1 Wekan prerelease. 2017-02-10 18:02:19 +02:00
Lauri Ojansivu 1e5fd0539f Update changelog 2017-02-10 14:11:24 +02:00
Lauri Ojansivu 4b7b5e9796 Merge branch 'greenkeeper-xss-0.3.3' into devel 2017-02-10 09:59:02 +02:00
Lauri Ojansivu 0065ca3ad6 Merge branch 'devel' into greenkeeper-xss-0.3.3 2017-02-10 09:54:23 +02:00
Lauri Ojansivu 1f7d1f023f Merge branch 'AlexanderS-feature/link-to-shortcuts' into devel 2017-02-10 09:45:51 +02:00
Lauri Ojansivu 01137b48e3 Merge branch 'feature/link-to-shortcuts' of https://github.com/AlexanderS/wekan into AlexanderS-feature/link-to-shortcuts 2017-02-10 09:18:17 +02:00
Lauri Ojansivu 9a584091c0 Merge pull request #706 from kamijin-fanta/fix/viewer-link
UI: fix description link style.
2017-02-10 08:35:18 +02:00
Lauri Ojansivu 977763107c Merge branch 'umbertooo-fix-quit-board' into devel 2017-02-10 08:30:09 +02:00
Lauri Ojansivu fc9d6e302f Merge branch 'fix-quit-board' of https://github.com/umbertooo/wekan into umbertooo-fix-quit-board 2017-02-10 08:20:20 +02:00
Lauri Ojansivu 6900ad3f02 Merge pull request #707 from kamijin-fanta/fix/font-family
UI: fix font
2017-02-10 08:18:44 +02:00
Lauri Ojansivu 17309f6039 Merge branch 'qge-patch-1' into devel 2017-02-10 08:17:10 +02:00
Lauri Ojansivu 01372ab5cc Merge branch 'patch-1' of https://github.com/qge/wekan into qge-patch-1 2017-02-10 08:11:01 +02:00
Lauri Ojansivu 752f84363f Fix links. 2017-02-09 14:11:43 +02:00
Lauri Ojansivu 064f609fd7 Add link to donations. 2017-02-09 13:46:02 +02:00
Lauri Ojansivu 7c009c69f1 Clarified some text, because someone misunderstood it. 2017-02-09 11:23:10 +02:00
Lauri Ojansivu d5d4ccada1 Merge branch 'devel' of github.com:wekan/wekan into devel 2017-02-08 13:48:30 +02:00
Lauri Ojansivu 8c090344d4 Roadmap now at self-hosted Wekan, actual work happends on GitHub issues. Made descriptions more clear. 2017-02-08 13:48:14 +02:00
Lauri Ojansivu 44564b9fa6 Update translations. 2017-02-08 03:43:44 +02:00
Lauri Ojansivu 425129eb16 All of Wefork is now moved back to Wekan. 2017-02-08 03:24:40 +02:00
Lauri Ojansivu 5e30dcde49 Translations at Transifex moved from Wefork to Wekan. 2017-02-06 15:18:25 +02:00
Curtis G 3c3b744d16 Fix executeUpTo label when dragging cards
'popup' is not in the predefined hierarchy
2017-02-05 21:01:15 -05:00
Lauri Ojansivu 7102e91f50 Chat moved to Vanila, we will get more developers from there. 2017-02-06 01:29:41 +02:00
Lauri Ojansivu a3a26342f7 Fix typo. 2017-02-06 00:38:31 +02:00
Lauri Ojansivu 52131b956b Add missing word. 2017-02-06 00:35:32 +02:00
Lauri Ojansivu 1e5553b004 Fix typos etc. 2017-02-06 00:24:35 +02:00
Lauri Ojansivu 14d3c373c4 Add info about upcoming Wekan App Development Platform. 2017-02-06 00:21:14 +02:00
Lauri Ojansivu e0e0a6b945 Merge pull request #779 from jLouzado/devel
tweaked .gitignore to exclude .build/*
2017-02-05 20:42:09 +02:00
Lauri Ojansivu ac6ae7607e Documentation has been moved to Wekan wiki. 2017-02-05 20:23:19 +02:00
Joel L 490e15e2c0 Merge remote-tracking branch 'upstream/devel' into devel 2017-02-04 14:04:29 +02:00
Joel L 09c22eaa55 tweaked .gitignore to exclude .build/* 2017-02-04 13:54:47 +02:00
Lauri Ojansivu 3e2883b9df Moved all Wefork translations to Wekan. 2017-02-04 13:47:43 +02:00
Lauri Ojansivu b8f555ab22 Update README and CHANGELOG 2017-02-03 13:12:13 +02:00
Lauri Ojansivu 52a2ed0cdc Update translations from Wefork transifex. 2017-02-03 11:48:52 +02:00
Lauri Ojansivu 8bd7d624da Merge pull request #65 from BaobabCoder/devel
Remove a list
2017-02-03 11:07:48 +02:00
Lauri Ojansivu 40594485d8 Add checklist feature: Merge branch 'lkisme-ckls' into devel 2017-02-03 02:02:47 +02:00
Lauri Ojansivu 335b91f0a4 Add remaining of checklist feature code 2017-02-03 01:49:58 +02:00
Lauri Ojansivu 1cf9b1be4e Merge branch 'ckls' of https://github.com/lkisme/wekan into lkisme-ckls 2017-02-03 01:39:31 +02:00
Lauri Ojansivu 70f92c6e0e Merge pull request #91 from mario-orlicky/fixed-jade-warning
fixed warning in jade template
2017-02-03 01:04:04 +02:00
Lauri Ojansivu ff0af9c9c9 Merge pull request #777 from stephenmoloney/devel-local
fix & to &&
2017-02-03 00:21:11 +02:00
Stephen Moloney 46a5b6374c fix & to && 2017-02-02 22:19:16 +00:00
Lauri Ojansivu 3a574901bb Merge pull request #775 from stephenmoloney/devel-local
update docker compose
2017-02-02 19:36:33 +02:00
Stephen Moloney 9909e72727 run with variables 2017-02-01 20:11:45 +00:00
Stephen Moloney 271ab687d8 running with docker-compose 2017-02-01 20:11:34 +00:00
Stephen Moloney 22b5b9819d fix problem with arguments 2017-02-01 20:07:07 +00:00
Stephen Moloney 3f7919e0b3 update docker compose to latest dockerhub 2017-02-01 18:48:48 +00:00
Lauri Ojansivu 1ec25c2a52 Fix typos, thanks to umbertooo 2017-02-01 20:01:38 +02:00
Lauri Ojansivu 5b393756ef Add supported platform: Docker on SLES12SP1 2017-02-01 18:45:26 +02:00
Lauri Ojansivu 739715b619 Added working Docker example. Using MongoDB v3.2.11 2017-02-01 18:30:48 +02:00
Lauri Ojansivu e2e3e65d2f Fix screenshots. 2017-01-31 18:13:33 +02:00
Lauri Ojansivu 671dbdcb96 Start merging Wefork back to Wekan. 2017-01-31 18:07:01 +02:00
mario.orlicky 308bd53049 fixed warning in jade template 2017-01-29 22:28:07 +01:00
lksime 59731af139 Add checklist feature 2017-01-20 21:05:48 +08:00
Lauri Ojansivu 38c143b8bf Merge pull request #81 from stephenmoloney/devel-local
Allow superuser issue - build with a user.
2017-01-20 14:12:41 +02:00
Stephen Moloney 8ba08988ee remove cd /build 2017-01-20 10:54:32 +00:00
Stephen Moloney eda2d67924 Merge branch 'devel-local' of https://github.com/stephenmoloney/wekan into devel-local 2017-01-20 10:51:43 +00:00
Stephen Moloney e9efc9205d Change user to wekan for building with meteor 2017-01-20 10:50:46 +00:00
Stephen Moloney 5ff23de8f5 architecture typo 2017-01-20 10:50:46 +00:00
Stephen Moloney 8efcc5e6c2 typo 2017-01-20 10:50:46 +00:00
Stephen Moloney b88b710f09 slight formatting 2017-01-20 10:50:46 +00:00
Stephen Moloney 00af9fc0e4 --allow-superuser 2017-01-20 10:50:46 +00:00
Béranger Campardou 5b58b0b40c missing coma 2017-01-20 11:11:57 +01:00
Béranger Campardou 23cb98bb82 Fix activity message for list deletion 2017-01-20 11:09:34 +01:00
Stephen Moloney edd69ac0f7 Change user to wekan for building with meteor 2017-01-20 00:35:34 +00:00
Lauri Ojansivu 85354c995b Add Docker as supported platform. - Add some commas. 2017-01-18 11:05:10 +02:00
Lauri Ojansivu 0daad1a256 Add Docker as supported platform. 2017-01-18 11:03:11 +02:00
Stephen Moloney ca1641ff69 architecture typo 2017-01-17 23:52:36 +00:00
Stephen Moloney fd2d6efe4a typo 2017-01-17 23:48:55 +00:00
Stephen Moloney 14873f3b28 slight formatting 2017-01-17 23:48:19 +00:00
Stephen Moloney 4947272871 --allow-superuser 2017-01-17 23:46:36 +00:00
Lauri Ojansivu 3d377d8efa Merge pull request #73 from stephenmoloney/devel
change docker-compose.yml variables to uppercase
2017-01-18 01:01:18 +02:00
Stephen Moloney 7304028420 change docker-compose.yml VARS to CAPS 2017-01-17 22:44:03 +00:00
Lauri Ojansivu 353f71fe0f Merge pull request #72 from martingabelmann/devel
reduce image size
2017-01-17 22:24:12 +02:00
Martin Gabelmann 67d0036f62 remove dependencies of build packages 2017-01-17 20:03:36 +01:00
Martin Gabelmann 8644d3c5f3 combine all RUN statements 2017-01-17 20:03:08 +01:00
Lauri Ojansivu 3a028f89b6 Merge pull request #70 from qge/patch-1
Fix typo of multipleActions
2017-01-17 19:22:29 +02:00
Lauri Ojansivu c2d2fee256 Merge pull request #71 from stephenmoloney/devel
locally build docker image
2017-01-17 19:18:41 +02:00
Stephen Moloney 250650f46a change to mongo 3.4 2017-01-17 16:45:11 +00:00
Stephen Moloney 692f5fb10c locally build docker image 2017-01-17 08:49:42 +00:00
Lauri Ojansivu d619921d9c Created new VirtualBox appliance with Wefork etc. 2017-01-17 03:21:00 +02:00
Curtis G a4328bd309 Fix typo of multipleActions 2017-01-15 14:40:32 -05:00
Lauri Ojansivu 0c4e332aa8 Update Wefork URLs. 2017-01-13 21:18:00 +02:00
Béranger Campardou 1169c0d7dc resolve conflicts 2017-01-13 11:16:54 +01:00
Béranger Campardou f7f5f4a35d merge wefork 2017-01-13 11:16:37 +01:00
Béranger Campardou 5eda2c80f8 missing coma 2017-01-13 11:05:31 +01:00
Lauri Ojansivu a7aa7e9318 Add release dates to changelog. 2017-01-12 23:07:07 +02:00
Béranger Campardou 64e36d4827 Remove a list 2017-01-12 16:14:51 +01:00
Lauri Ojansivu bdd88f486e Update translations. 2017-01-10 18:06:03 +02:00
greenkeeperio-bot 89959753cd chore(package): update xss to version 0.3.3
https://greenkeeper.io/
2016-12-20 02:19:19 +01:00
Lauri Ojansivu 2ee7f1383c Add autoinstall script as upcoming platform. 2016-12-16 15:38:30 +02:00
Lauri Ojansivu be3995716c Install from source as supported platform. 2016-12-16 15:29:29 +02:00
Lauri Ojansivu fd18ca314a v0.11.0 Wekan fork first release. 2016-12-16 14:03:29 +02:00
Lauri Ojansivu 22b54d3f08 Update Chinese (Taiwan) and Italian translations. 2016-12-14 21:56:28 +02:00
Lauri Ojansivu 08ec85e394 Update translations. 2016-12-13 16:51:23 +02:00
Lauri Ojansivu 51002bed74 Update Chinese (Taiwan) translation. 2016-12-13 12:36:08 +02:00
Lauri Ojansivu 8050c7c6c6 Update translations. 2016-12-13 09:37:53 +02:00
Lauri Ojansivu 2fd010b04d Fix typo. 2016-12-01 00:05:46 +02:00
Lauri Ojansivu b75e5ef4c4 Add already committed features and bugfixes. 2016-12-01 00:04:03 +02:00
Lauri Ojansivu 4bbc6d8a7d Update platforms on README.md 2016-11-30 22:28:05 +02:00
David Renshaw b6cac06d48 Merge pull request #32 from dwrensha/sandstorm-version-17
update Sandstorm metadata for release
2016-11-28 21:43:58 -05:00
David Renshaw aa97867b36 update Sandstorm metadata for release 2016-11-28 21:17:04 -05:00
Lauri Ojansivu e41eeae09f Merge pull request #31 from mario-orlicky/show-cards-count
New option to set up minimum limit to show cards count for each list …
2016-11-29 04:05:29 +02:00
Lauri Ojansivu 56139e3307 Merge pull request #30 from dwrensha/show-card-comments
set isLoaded to true on both transitionend and animationend
2016-11-29 03:53:48 +02:00
Lauri Ojansivu fd6c54b2a7 Merge pull request #28 from dwrensha/subs-manager-monkey-patch
hack to avoid 'board not found' problem in Sandstorm
2016-11-29 03:46:33 +02:00
Lauri Ojansivu b540eef855 Merge pull request #26 from shoetten/duedate
Start- and Duedate for cards
2016-11-29 03:34:49 +02:00
Lauri Ojansivu 96e5e8d058 Merge pull request #25 from dwrensha/board-members-join
fix bug where old users could see broken presence indicators on new users
2016-11-29 03:23:07 +02:00
Mario Orlicky 35778d2673 fixed few overseights 2016-11-25 21:53:18 +01:00
Mario Orlicky 606dbbbbf2 New option to set up minimum limit to show cards count for each list in board 2016-11-25 21:45:11 +01:00
David Renshaw 6090ede8c9 set isLoaded to true on both transitionend and animationend 2016-11-23 21:00:18 -05:00
David Renshaw cacaa0ee8c hack to avoid 'board not found' problem in Sandstorm 2016-11-22 22:20:39 -05:00
shoetten de3be14d01 Use atmosphere package of bootstrap-datepicker lib. 2016-11-22 21:28:54 +01:00
shoetten 33b74a465e Fix "can't set timers inside simulations error" when moving cards with start/due dates. 2016-11-22 21:28:54 +01:00
shoetten 6064393ad3 Refactor code based on eslint guidelines. 2016-11-22 21:28:47 +01:00
shoetten aa5ed6e484 Update translations and title of date badges. 2016-11-22 21:28:46 +01:00
shoetten 5dd554b999 Color highlight start and due dates with correct timezone handling. 2016-11-22 21:28:46 +01:00
shoetten 80b93ce711 Display start and due dates in minicards. 2016-11-22 21:28:31 +01:00
David Renshaw be47357cd4 don't chain the presences cursor on the users cursor 2016-11-22 10:34:31 -05:00
David Renshaw 7b5d08afd1 fix bug where old users could see broken presence indicators on new users 2016-11-21 22:49:53 -05:00
shoetten d4497d7aeb Add basic start and due dates for cards. 2016-11-21 15:15:16 +01:00
shoetten 182c9af123 add bootstrap-datepicker v1.5.1 as client lib 2016-11-21 15:15:16 +01:00
shoetten 89df0bda9b Adds start and due date to cards model. 2016-11-21 15:15:16 +01:00
Lauri Ojansivu 1ad4107201 Merge pull request #19 from mario-orlicky/hide-system-messages
New change settings option and possibility to hide system messagaes
2016-11-20 23:31:50 +02:00
Lauri Ojansivu 693f615136 Merge pull request #18 from fmonthel/devel
[ENH] Add index on CardId into Comments collection
2016-11-20 23:12:07 +02:00
Lauri Ojansivu 532a3bbb49 Merge pull request #17 from mario-orlicky/show-error-username-taken
Display message when user wants to choose existing username (Fixes: #16)
2016-11-20 23:01:57 +02:00
Mario Orlicky 4359f66ece Fixed build 2016-11-19 19:19:24 +01:00
Mario Orlicky 8290dcb249 New change settings option and possibility to hide system messagaes 2016-11-19 19:02:33 +01:00
Mario Orlicky 828d34b70e fixed indentation 2016-11-18 23:23:13 +01:00
Mario Orlicky 69fbd31abc Display message when user wants to choose existing username (Fixes: #16) 2016-11-18 23:18:16 +01:00
fmonthel 584ab26aee [ENH] Add index on CardId into Comments collection 2016-11-17 21:25:49 -05:00
fmonthel f71d2538fa [ENH] Add index on CardId into Comments collection 2016-11-17 21:23:39 -05:00
fmonthel d11f069b60 [ENH] Add index on CardId into Comments collection 2016-11-17 21:18:35 -05:00
Lauri Ojansivu 94cdcff79f Update screenshot. 2016-11-17 17:17:18 +02:00
Lauri Ojansivu 33913cf1ce Update screenshot. 2016-11-17 16:46:58 +02:00
Lauri Ojansivu 2d3bc356c0 Merge pull request #14 from dwrensha/sandstorm-appdemo
Add a working 'try Wekan on Sandstorm' button.
2016-11-17 16:29:14 +02:00
David Renshaw b89a0e2d4d Add a working 'try Wekan on Sandstorm' button. 2016-11-17 09:25:56 -05:00
Lauri Ojansivu a635ac9818 Fix Travis badge to use devel branch. 2016-11-17 16:16:27 +02:00
Lauri Ojansivu 1ec72ba189 Add link to Wekan fork FAQ. 2016-11-17 15:16:45 +02:00
Lauri Ojansivu 4d3a40bf4f Add link to Wekan fork FAQ. 2016-11-17 15:09:12 +02:00
Lauri Ojansivu d2646a5820 Update screenshot. 2016-11-17 13:01:40 +02:00
Lauri Ojansivu 0ba272b22c Merge pull request #10 from dwrensha/lint
Fix eslint regressions.
2016-11-17 12:11:03 +02:00
David Renshaw 3ce7958231 Fix eslint regressions. 2016-11-16 08:41:29 -05:00
Lauri Ojansivu 7e3173caea Update screenshot. 2016-11-16 11:52:48 +02:00
Lauri Ojansivu fa6267cf44 Merge pull request #6 from mario-orlicky/filter-by-empty
Filter by empty
2016-11-15 23:46:58 +02:00
Lauri Ojansivu 0733fd64ee Merge pull request #4 from dwrensha/t9n-set-language
Fix failure to load when navigator.language is Chinese or Finnish.
2016-11-15 23:35:30 +02:00
David Renshaw 4b248151c3 always fall back to navigator.language if user.profile.language is not set 2016-11-15 15:03:12 -05:00
David Renshaw f56c55e75c Wait until Meteor.startup() to set the language. 2016-11-15 15:03:12 -05:00
David Renshaw 1c206d0d36 Fix startup for clients using Finnish and Chinese. 2016-11-15 15:03:12 -05:00
David Renshaw afca7ce6da Merge pull request #8 from dwrensha/sandstorm-restore-identity-bugfix
Sandstorm restore identity bugfix
2016-11-15 15:01:33 -05:00
David Renshaw 6930535555 update Sandstorm metadata for bugfix release 2016-11-15 14:40:23 -05:00
David Renshaw 74e41e420f [sandstorm]: fix bug where an identity that fails to restore could not be added to a card 2016-11-15 14:39:23 -05:00
Lauri Ojansivu 5657b6f8c7 Add travis build status badge. 2016-11-14 18:01:45 +02:00
Lauri Ojansivu 2f234953f6 Add travis build status badge. 2016-11-14 17:58:24 +02:00
Mario Orlicky 4dc0ec07b8 removed unused html span element 2016-11-13 20:57:23 +01:00
Mario Orlicky 7ad74eb1b5 forgotten semicolon 2016-11-13 20:54:50 +01:00
Mario Orlicky 5968792ad2 added buttons to support filtering by empty labels and members 2016-11-13 20:48:24 +01:00
Mario Orlicky 5a23c962d2 Filtering logic by empty labels/members 2016-11-13 20:38:14 +01:00
Pierre Ozoux 48cf28282d Merge pull request #5 from mario-orlicky/label-hover-background
UI: Fixed background on hover for labels in filter sidebar
2016-11-13 19:26:30 +00:00
Mario Orlicky 300b40ed87 UI: Fixed background on hover for labels in filter sidebar 2016-11-13 17:23:49 +01:00
David Renshaw 00216f18ac Merge pull request #3 from dwrensha/fullname-bugfix
fix minor bug in Sandstorm username handling
2016-11-08 10:33:45 -05:00
David Renshaw 89eb156529 Fix bug where share-by-powerbox could fail if the recipient's display
name was the same as an existing user's handle.
2016-11-08 09:47:36 -05:00
Pierre Ozoux f11873e44a Merge pull request #2 from dwrensha/spk-release
Update version and author information for new release on Sandstorm.
2016-11-08 07:35:07 +00:00
David Renshaw 33cfee8d5f Update version and author information for new release on Sandstorm.
Previously @mquandalle took care of packaging Wekan for Sandstorm, so
he was listed as the sole author of the SPK. Since I'm now taking over
packaging, this commit moves @mquandalle into the `upstreamAuthor`
slot and adds me as the SPK author by using my email address for
`contactEmail` and adding a pgp-signed statement that I am now an author.
It also adds my public key to the `keyring` file.
2016-11-07 17:16:43 -05:00
Lauri Ojansivu 4d41e70e12 Merge pull request #1 from dwrensha/wefork-sandstorm-update
Wefork sandstorm update
2016-11-07 23:34:36 +02:00
David Renshaw 43c180c247 Make sure identities resolve before sending them to activity(). 2016-11-03 23:42:00 -04:00
David Renshaw 349cdd4bf9 Integration with Sandstorm events/notifications. 2016-11-03 23:42:00 -04:00
David Renshaw 4d6ab3094c Prevent the capnproto connection from getting garbage collected. 2016-11-03 23:42:00 -04:00
David Renshaw 95680ef43a only show 'add member' button to users who can edit the board 2016-11-03 23:42:00 -04:00
David Renshaw 1ad44de8c6 powerbox identity requests 2016-11-03 23:42:00 -04:00
David Renshaw 9f4300d38b Fix updating of permissions and profile. 2016-11-03 23:42:00 -04:00
Drew Fisher 0f62fe0c6e Fix login on Sandstorm by not creating welcome boards
This one is a pretty strange chain of events:

* fetching /.sandstorm-login via accounts-sandstorm's rendezvous protocol
  causes a user to be created in the users collection
* models/users.js has hooks to create a board and lists when a user is created
* models/activities.js has a hook to create activity entries when a list is
  created
* this hook does not handle not having no boardId, which results in attempting
  to run the hook with boardId: 'false'.  'false' does not have a title
  attribute, which causes the whole method call to throw an exception.
* This makes the initial login fail.

While there may be other bugs, the simple fix is to not create the board and
lists when running under Sandstorm, where you only have one board anyway.
2016-11-03 23:42:00 -04:00
Drew Fisher 87ce042c63 Add SANDSTORM=1 to the environment under Sandstorm
We add the SANDSTORM=1 environment variable to sandstorm-pkgdef.capnp so that
accounts-sandstorm will ensure that it's the only loaded accounts package when
running under Sandstorm.
2016-11-03 23:42:00 -04:00
Lauri Ojansivu 91f9cf12b7 Add Debian Wheezy 64bit install doc by soohwa 2016-11-01 09:59:28 +02:00
Felix Michels eb618c891f Method 'quitBoard' requires boardId but got board 2016-10-26 14:18:28 +02:00
Pierre Ozoux d874ce70f7 Move back IndieHosters 2016-10-21 15:57:19 +01:00
Lauri Ojansivu 8bbcbea235 Fix screenshot link 2016-10-20 22:06:32 +03:00
Lauri Ojansivu b159e9b3d1 Update screenshot. Fix chat svg link. Fix typo. 2016-10-20 21:58:40 +03:00
Lauri Ojansivu 253c482b9c Add link to roadmap 2016-10-20 21:01:30 +03:00
Lauri Ojansivu ed5a4be4f4 Add link to Wekan fork announcement 2016-10-20 18:49:09 +03:00
Lauri Ojansivu 1a3a878778 Fix Rocket.Chat badge. 2016-10-20 18:35:41 +03:00
Lauri Ojansivu 9f3cbcbcb0 Try to fix Rocket.Chat badge. 2016-10-20 18:31:27 +03:00
Lauri Ojansivu 2151252601 Update Wekan fork info to README 2016-10-20 18:27:48 +03:00
Felix Michels 82a5da61df Use the navigator's language properties even if a user exists but the user has not yet choosen a profile language. If the browser provides multiple preferred languages via navigator.languages, select the most-preferred one.
WKN-47
2016-10-19 15:57:14 +02:00
kamijin-fanta 2ae6a009f0 UI: fix font
- Add YuGothic and Meiryo. because display of non english letter dirty.
2016-10-12 10:32:39 +09:00
kamijin-fanta e564e94c94 UI: fix description link style.
- apply underline
- change text color on hover
2016-10-12 10:02:09 +09:00
Maxime Quandalle b90d668fbc Merge pull request #669 from AlexanderS/fix/remove-user-on-leave
Fix remove user actions
2016-09-02 16:17:08 +02:00
Alexander Sulfrian 4013184801 Models: Remove board from starred list
This will fix the starred counter. If the board is not public, the user
is unable to see the board and remove it from the list of starred
boards.
2016-08-16 19:19:55 +02:00
Alexander Sulfrian 7b0e57380a Models: Remove user from all objects on board leave (Fixes: #667)
Remove the user as member and watcher of all lists, cards and the board itself
when leaving the board.
2016-08-16 19:19:39 +02:00
Alexander Sulfrian ce4fcbfae4 Models: Fix remove member activity
The member is only set to inactive, so we could not test for $pull.
Instead we have to look into the $set modified and check whether the
member was deactivated.
2016-08-16 19:19:39 +02:00
Maxime Quandalle 301210c87b Fix eslint testing
Partially reverting c8705a0
2016-07-21 12:52:32 +02:00
Maxime Quandalle dd95f0b002 Release 0.11.0-rc2 2016-07-21 11:25:34 +02:00
Maxime Quandalle 77069a36cd Fix undefined variables errors 2016-07-21 11:19:52 +02:00
Drew Fisher 3643bd4996 Fix bug where you get a "null" option in @-mention autocomplete (#649) 2016-07-21 11:09:14 +02:00
Alexander Sulfrian 4d0e4cea91 models: Remove wrong line (fix #650) (#651) 2016-07-21 01:49:41 +02:00
Maxime Quandalle 8dc35d638b Release 0.11.0-rc1 2016-07-20 22:36:05 +02:00
Maxime Quandalle 79cc3556f5 Pull translations from Transifex
As suggested in #604 there might be some language unnecessary redundancy, for
instance between 'es' (Spanish) and 'es-ES' (Spain's Spanish), but we'll figure
that out during the release candidate phase.
2016-07-20 22:30:17 +02:00
Maxime Quandalle 3ecdeb6796 Complete the release notes 2016-07-20 22:27:51 +02:00
Maxime Quandalle c8705a0fdc Clean NPM scripts output
I've just discovered that the reason NPM outputs a giant "npm ERR!" message
asking to contact the author of the library and suggesting that it’s most likely
“not a problem with npm itself” when I run "npm run lint" and I forgot a
semicolon is because the return code of an NPM script has to be 0. So this
commit adds "exit 0;" at the end of the NPM commands.
2016-07-20 22:21:41 +02:00
Maxime Quandalle 1f3015bd2c Fix #573 2016-07-20 22:21:41 +02:00
Maxime Quandalle 3bc28b5e8a Format the deployment section of the README.md 2016-07-20 18:06:40 +02:00
Maxime Quandalle 27a58c18ee Implement a disconnected indicator
Fixes #451
2016-07-20 18:04:16 +02:00
Johannes Zellner 9595ef0199 Add Cloudron install button (#639) 2016-07-20 18:03:20 +02:00
Maxime Quandalle 98997cc47d Add the Transifex configuration to the repository
This was proposed in #604, and I now beleive it is actually good to provide
admin/maintainer scripts in the repository.

We still need to clean-up the language list, again as suggested in #604.
2016-07-20 16:17:21 +02:00
Maxime Quandalle 8d555707f2 Add VSCode editor configuration to the repository 2016-07-20 15:54:59 +02:00
Maxime Quandalle 3ed00f3db7 Avoid <a> links redirections on inlinedForm
Fixes #647 (IE 11)
2016-07-20 11:33:51 +02:00
Maxime Quandalle 9d3271b731 Update Meteor to 1.3.5.1
Meteor is moving fast these days! This version should make Wekan quicker to
start.

These packages were also updated:

accounts-password  upgraded from 1.1.12 to 1.1.13
babel-compiler     upgraded from 6.8.4 to 6.8.5
coffeescript       upgraded from 1.1.3 to 1.1.4
ddp-server         upgraded from 1.2.9 to 1.2.10
ecmascript         upgraded from 0.4.7 to 0.4.8
email              upgraded from 1.0.15 to 1.0.16
npm-bcrypt         upgraded from 0.8.6_2 to 0.8.6_3
stylus             upgraded from 2.512.4 to 2.512.5
templating         upgraded from 1.1.13 to 1.1.14
tracker            upgraded from 1.0.14 to 1.0.15
webapp             upgraded from 1.2.10 to 1.2.11
2016-07-20 11:33:45 +02:00
Maxime Quandalle bda1df5ada Fix an event name from animationend to transitionend
Closes #646
2016-07-19 17:17:51 +02:00
Maxime Quandalle b96a60c9bb Merge PR #593 into devel 2016-07-19 02:18:44 +02:00
Alexander Sulfrian 43f3a2f3d5 Fix untranslated watch/unwatch for gecko (#606)
In the Gecko JavaScript engine the Object prototype has a method
'watch()' and 'unwatch()'. This causes strange error messages displayed,
if 'watch' and 'unwatch' are not translated in the chosen localization.
The i18n module cannot handle, if it gets a function for the
translation.

This is a quick fix that removes the 'watch' and 'unwatch' properties
from the Object prototype.

See also: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/watch
2016-07-19 02:17:15 +02:00
Peter Dave Hello 952c2e1ae2 optimize png images losslessly using zopflipng 2016-07-18 22:54:03 +02:00
Maxime Quandalle 9792193e60 Add MongoDB indexes
These indexes will optimize the queries that are used in the board and card
views.

Fixes #524.
2016-07-18 22:38:38 +02:00
Alexander Sulfrian 81a35be856 Fix move to top
If the minOrder is 0, the previous code does not work. This code is now
doing the obvious stuff to change the order.
2016-07-18 18:14:46 +02:00
Maxime Quandalle 35c6b51a3f Meteor and Meteor packages updates
Meteor was updated to 1.3.4.4, though we haven't modified the code base to
organize it around the new module system, we will still benefit from the
possibility of importing NPM packages dirrectly. From my tests, it also improves
the build time.

Also as https://github.com/meteor/meteor/pull/5841 was merged in Meteor 1.3.4.2,
\#385 is now fixed.

We updated the following packages in the process:

aldeed:collection2          upgraded from 2.8.0 to 2.9.1
aldeed:collection2-core     upgraded from 1.0.0 to 1.1.1
alethes:pages               upgraded from 1.8.4 to 1.8.6
arillo:flow-router-helpers  upgraded from 0.4.7 to 0.5.2
blaze-html-templates        removed from your project
cfs:http-methods            upgraded from 0.0.30 to 0.0.32
cosmos:browserify           removed from your project
cottz:publish-relations     upgraded from 2.0.0 to 2.0.6
kadira:dochead              upgraded from 1.4.0 to 1.5.0
kadira:flow-router          upgraded from 2.10.1 to 2.12.1
kenton:accounts-sandstorm   upgraded from 0.1.8 to 0.5.1
meteorhacks:fast-render     upgraded from 2.11.0 to 2.14.0
meteorhacks:inject-data*    upgraded from 1.4.1 to 2.0.0
meteorhacks:meteorx         added, version 1.4.1
meteorhacks:subs-manager    upgraded from 1.6.3 to 1.6.4
mquandalle:jade             upgraded from 0.4.8 to 0.4.9
softwarerero:accounts-t9n   upgraded from 1.1.7 to 1.3.4
tap:i18n                    upgraded from 1.7.0 to 1.8.2
templates:tabs              upgraded from 2.2.0 to 2.2.2
useraccounts:core           upgraded from 1.13.1 to 1.14.2
useraccounts:flow-routing   upgraded from 1.13.1 to 1.14.2
useraccounts:unstyled       upgraded from 1.13.1 to 1.14.2
2016-07-18 17:51:41 +02:00
Maxime Quandalle 4f5cecf738 Merge #616 into devel 2016-07-18 15:40:41 +02:00
Alexander Sulfrian 855f56c61a profile.name is called profile.fullname (#615)
The name of the profile field was changed log ago. This fixes the
remaining wrong references.
2016-07-11 12:05:03 +02:00
Alexander Sulfrian 36f17a5717 UI: Fix overlapping click event handler (#614)
The click event handler for links in the card display are overlapping:
The general event for opening the link in a new window matches on user
mentions, too. But user mentions cannot be opened in a new window.
2016-07-11 12:04:42 +02:00
Alexander Sulfrian 3f12e3e96f UI: Fix small bug with the multi-selection button (#591)
This bug was introduced in 081b09207f.
2016-07-11 12:03:22 +02:00
Prayag Verma c7e457e63f Fix a typo (#515)
Remove extra `the`
2016-07-11 12:00:56 +02:00
Alexander Sulfrian e521fe617e Welcome board: Allow localization 2016-06-03 03:56:41 +02:00
Alexander Sulfrian ae2c1fb77f Fix initial board creation
We cannot rely on the automatic userId setting of the collection hooks.
If a user is created during invitation, the userId field will contain
the id of the inviting user.

This fix this, by mocking the CollectionHooks.getUserId function and
returning the userId of the new user for all new documents after
creating the user.
2016-06-03 03:56:40 +02:00
Alexander Sulfrian b9883a8e24 Remove duplicated logic
The duplicated logic was nessessary because the before.insert hook was
not called before validation, when inserting was initiated on the server.
Using autoValues fixed this problem.
2016-06-03 03:56:38 +02:00
Alexander Sulfrian 18b1573b25 Meteor.users: Add SimpleSchema
Replace before.insert hook with SimpleSchema and autoValue.
2016-06-03 03:56:37 +02:00
Alexander Sulfrian a2888250f4 Models: Replace before.insert with autoValues
The before.insert hooks have the problem, that they are executed in a
different order if called from the client or from the server. If called
from the client, the before.insert hook is called before validation of
the schema, but if called from the server, the validation is called
first and fails.
2016-06-03 03:56:35 +02:00
Alexander Sulfrian ecf050ba54 UI: Put every attachment action on its own line 2016-05-19 21:19:43 +02:00
Alexander Sulfrian 8fd4c17628 UI: Scale the attachemnt thumbnails
The attachements should be scaled inside the card, too.
2016-05-19 21:19:43 +02:00
Alexander Sulfrian a6bcd5bd1c UI: Center add-attachment link 2016-05-19 21:19:43 +02:00
Alexander Sulfrian 29e7aeff5d UI: Fix scaling of cover images (Fixes: #548)
This reverts f039923ac1 and fixes #196 in
a different way (adding quotes). So that we can use the css background
properties to scale the cover images.
2016-04-25 21:49:56 +02:00
Alexander Sulfrian c9e24ade24 UI: Add link to keyboard shortcuts 2016-04-25 19:07:36 +02:00
Alexander Sulfrian 14e2b3c15f Add changes for v0.11 to the changelog 2016-04-21 21:03:37 +02:00
Alexander Sulfrian 5916ff3c1b UI: Add missing title attributes
The buttons of the normal view should have the same title attribute, than
the mini screen buttons.

I missed this in 0587158b6b.
2016-04-21 20:39:39 +02:00
Alexander Sulfrian fad5150ada UI: Add log-in button to public boards
Even if a board is public and a user can view it, the user might want to
log in to be able to edit the board.

The button replaces the "public" permission indicator, because it is
obvious (if the user is not logged in and can view the board, it has to
be public).
2016-04-21 20:38:09 +02:00
Alexander Sulfrian 081b09207f UI: Only display the options, if there is a board
The board options does not have valid use case (or even valid values) if
the board is not found (either because the user is not logged in or the
board really does not exists).
2016-04-21 20:37:10 +02:00
Alexander Sulfrian 7513520a9b UI: Do not display notification settings
The notification settings are only usefull if there is a current user,
because the email address is required.
2016-04-21 20:35:26 +02:00
Alexander Sulfrian 0587158b6b Some small fixes for the buttons in the board header (#580)
* UI: Fix title of button

The multi selection button should not get the filter description.

* UI: Add title for all buttons in the header bar

This is espectially important for the miniScreen view, because there
is only the icon and no text next to the button.
2016-04-21 19:26:27 +02:00
Alexander Sulfrian b24ee67bbb UI: Center text in the avatars (#581) 2016-04-21 19:25:54 +02:00
Alexander Sulfrian abc58e7482 Do not publish the whole user doc of board members (#579)
The user document contains hashed passwords and hashed resume tokens.
We should only publish the required bits.
2016-04-21 19:24:42 +02:00
Alexander Sulfrian 3a0a9fa009 Fix initials avatar generation (#577)
The ES5 reduce method also needs a initial value. This bug was
introduced in aa974aa54a.
2016-04-21 19:24:08 +02:00
Maxime Quandalle 90428e7ba1 Merge pull request #530 from ForNeVeR/feature/move-to-end
Move cards to top / bottom
2016-03-19 11:34:10 +01:00
Friedrich von Never cfbc8eed68 cardDetails: allow to move cards to top / bottom 2016-03-19 10:40:23 +06:00
Maxime Quandalle e1d01e1652 Merge pull request #531 from TheElf/devel
Plural of Emoji
2016-03-18 17:14:10 +01:00
Maxime Quandalle 90601eacae Upgrade ESLint to v2
This commit also tweak the code style following backward-incompatible v2 rules.
2016-03-17 16:26:14 +01:00
Daniel c05029d403 Changes in code to correct the spelling of emoji (plural) 2016-02-28 23:10:52 -06:00
Daniel dc05b01ee1 Changing to the correct pluralization of emoji 2016-02-28 21:51:05 -06:00
Maxime Quandalle b8aefedcc3 Fix a bug with the inheritance model
See https://github.com/meteor/meteor/issues/6162
2016-02-10 17:19:04 +01:00
Maxime Quandalle 8ab39f0baf Merge pull request #512 from pierreozoux/patch-1
Adds IndieHosters SaaS offer
2016-02-07 12:35:24 +01:00
pierreozoux c30ea6afbb Adds IndieHosters SaaS offer
I'm wondering, should it be in a different category than PaaS offer?
2016-02-05 19:54:16 +00:00
Maxime Quandalle 6f2724fb90 Update flow router to 2.10.1 from 2.10.0
Fixes #498
2016-02-01 18:00:45 +01:00
Maxime Quandalle b490acf9fb Merge pull request #430 from wekan/full-screen-import
Full screen board import
2016-02-01 17:53:34 +01:00
Maxime Quandalle b5ebbd2bf9 Simplify an internal data model used in the importer
We used to save the whole user document in a internal data structure while we
only needed the userId.
2016-01-31 20:03:17 +01:00
Maxime Quandalle a13fad749e Change the board import layout from a popup to a full page
This commit also removes the “import a single Trello card” as we couldn’t figure
out some reasonable use case.

We also create a new publication on the server to provide the minimal user
profile informations required to display an avatar.
2016-01-31 20:03:12 +01:00
Maxime Quandalle 67e7b6a139 Merge pull request #477 from floatinghotpot/bugfix-notification
Bugfix, and optimize icon for notification
2016-01-08 12:18:59 +01:00
Maxime Quandalle f68112be38 Merge pull request #478 from seschwar/devel
ports in docker-compose.yml must be an array
2016-01-08 12:18:17 +01:00
Sebastian Schwarz cf7fd53130 ports in docker-compose.yml must be an array 2016-01-08 10:14:55 +01:00
floatinghotpot 470832e798 Bugfix, and optimize icon for notification 2016-01-08 11:44:20 +08:00
Maxime Quandalle 1e8368dea5 Merge pull request #454 from floatinghotpot/notification
Add notifications, allow watch boards / lists / cards
2016-01-06 12:49:58 +01:00
floatinghotpot 39e1cc0237 Improve PR, adding more comments 2016-01-06 16:59:25 +08:00
Maxime Quandalle 61e6e71f29 Downgrade blaze-component
The upgrade in 9ef8eba introduced a breaking change.

peerlibrary:blaze-components  downgraded from 0.16.2 to 0.15.1
peerlibrary:data-lookup       removed from your project

Fixes #471
2016-01-05 18:14:56 +01:00
Liming Xie 9bbdacc79a Add notification, allow watch boards / lists / cards 2016-01-05 23:26:02 +08:00
Maxime Quandalle 701262a439 Favor FlowRouter.url over Meteor.absoluteUrl
It hides the leading slash treatment as an hidden implementation
detail.
2016-01-05 13:37:15 +01:00
Maxime Quandalle 9ef8ebaf09 Update Meteor packages
aldeed:collection2            upgraded from 2.5.0 to 2.8.0
aldeed:collection2-core       added, version 1.0.0
aldeed:schema-deny            added, version 1.0.1
aldeed:schema-index           added, version 1.0.1
aldeed:simple-schema          upgraded from 1.3.3 to 1.5.3
cosmos:browserify             upgraded from 0.9.2 to 0.9.3
mdg:validation-error          added, version 0.2.0
meteorhacks:subs-manager      upgraded from 1.6.2 to 1.6.3
peerlibrary:blaze-components  upgraded from 0.15.1 to 0.16.2
peerlibrary:data-lookup       added, version 0.1.0
useraccounts:core             upgraded from 1.13.0 to 1.13.1
useraccounts:flow-routing     upgraded from 1.13.0 to 1.13.1
useraccounts:unstyled         upgraded from 1.13.0 to 1.13.1
2016-01-04 02:06:46 +01:00
Maxime Quandalle ac6491ea12 Remove unnecessary template name declaration
This code was duplicate with the name we use to `register` the
component. A update of blaze-component removed the need to duplicate
this declaration.
2016-01-03 23:45:46 +01:00
Maxime Quandalle 46747b01fb Fix card infinite scrolling on card activities
I imagine blaze-component changed their Mixins API since I written
this code. We need some tests to avoid this kind of regressions when
updating dependencies!

Fixes #420
2016-01-03 23:40:08 +01:00
Maxime Quandalle 8c01d51577 Complete the Docker Compose manifest 2016-01-03 16:04:40 +01:00
Maxime Quandalle 45c542cec3 Merge pull request #468 from choclin/feature/show_exact_activity_time
Show the exact timestamp when hovering the activity time
2016-01-03 00:06:14 +01:00
Dominic Sonntag 7357d28fea added exact time as tooltip to activity time (saying only something like 'x days ago') 2016-01-03 01:47:16 +03:00
Maxime Quandalle 272f67f0c6 Update some meta-data
New site url
New contact email
New year!
2016-01-02 17:15:19 +01:00
Maxime Quandalle 847780760a Deploy master branch on Scalingo
For one `devel` is not stable and it's better to use the last released
version which is always in sync with `master`. Also Scalingo currently
doesn't support running "non-standard" versions of the Meteor build
tool such as the one we are currently using in `devel`.
2016-01-02 17:02:37 +01:00
Maxime Quandalle 8b5fd09ff3 Fix layout on Apple devices
The layout issue was related to the lack of autoprexing for CSS
properties. c69f993 did improve the reload time significantly but for
that I had to replace `mquandalle:stylus` by the core `stylus`
package. Unfortunatly it is currently difficult to run an autoprefixer
with the core CSS compilers (as reported in
https://github.com/meteor/meteor/issues/5219).

So instead we rely on `nib` which transparently define some mixins for
autoprefixing, the only restrictions being that we have to manually
`@import 'nib'` on top of stylus files.

Fixes #461
2016-01-02 14:26:48 +01:00
Maxime Quandalle 0cdcccf1f6 Send invite email in the server console in development mode
Meteor support that use case for us, we don't need to implement our
own validate strategy on top of that. This was also discussed as part
of the #454 review.
2016-01-01 13:31:54 +01:00
Maxime Quandalle 9fa2917634 Merge pull request #463 from alayek/autosize-card-title
Autosize card title

Fixes #394
2016-01-01 10:45:07 +01:00
alayek 23ca733afd change edit card title input to textarea for editing larger titles 2016-01-01 02:47:19 +05:30
Maxime Quandalle 9c013d3233 Merge branch 'master' into devel
Conflicts:
	sandstorm-pkgdef.capnp
2015-12-30 19:42:35 +01:00
Maxime Quandalle 5495829f11 Release 0.10.1 2015-12-30 19:36:08 +01:00
Maxime Quandalle 0587223489 Fix avatar support on Sanstorm
The bug comes for 9154b06 which this commit partially reverts. The
synchronization between the user document profile and the Sandstorm
HTTP headers is still not perfect. Having a clean model may requires
the `accounts-sandstorm` to expose a hook to modify the user document
just after the `services.sandstorm` credentials are updated.

Fixes #460
2015-12-30 19:36:01 +01:00
Maxime Quandalle 15e692a7d2 Fix drag and drop on Sandstorm
This bug was introduced with the introduction of fast-render in
41b23f8. With fast-render data is available instantly after the page
logging, but calls to `Meteor.userId()` still return `null` as the
user isn't authenticated on the DDP channel yet (previously the data
was loaded on DDP after user authentication). Which mean that we know
need to reactively activate Drag and Drop on user log in.

I'm not sure why I was not able to reproduce this bug outside of
Sandstorm.

Fixes #453
2015-12-30 19:35:56 +01:00
Maxime Quandalle d9b74131ae Fix avatar support on Sanstorm
The bug comes for 9154b06 which this commit partially reverts. The
synchronization between the user document profile and the Sandstorm
HTTP headers is still not perfect. Having a clean model may requires
the `accounts-sandstorm` to expose a hook to modify the user document
just after the `services.sandstorm` credentials are updated.

Fixes #460
2015-12-30 19:34:18 +01:00
Maxime Quandalle f6c01161a0 Fix drag and drop on Sandstorm
This bug was introduced with the introduction of fast-render in
41b23f8. With fast-render data is available instantly after the page
logging, but calls to `Meteor.userId()` still return `null` as the
user isn't authenticated on the DDP channel yet (previously the data
was loaded on DDP after user authentication). Which mean that we know
need to reactively activate Drag and Drop on user log in.

I'm not sure why I was not able to reproduce this bug outside of
Sandstorm.

Fixes #453
2015-12-30 19:22:30 +01:00
Maxime Quandalle 46bf6ef803 Force new lines at the end of files 2015-12-30 17:03:27 +01:00
Maxime Quandalle 0833a22742 Forbid trailing spaces 2015-12-30 16:49:39 +01:00
Maxime Quandalle 6dc7404f23 Share the router configuration between the client and the server 2015-12-28 23:13:20 +01:00
Maxime Quandalle 592aa6d576 Partially revert aae5030
As discussed in #370 and announced in the official Eslint-meteor
plugin repository (https://github.com/dferber90/eslint-plugin-meteor),
it is recommended to not use this plugin anymore has the author has it
is currently broken and the author has abandoned it.
2015-12-24 13:13:05 +01:00
Maxime Quandalle d9bc56896d Merge pull request #455 from floatinghotpot/bugfix-userform
optimize login form layout & css
2015-12-28 10:44:11 +01:00
floatinghotpot 55bd26dc9c Optimize login form layout & css
Fixes #448
2015-12-28 11:35:38 +08:00
Maxime Quandalle cf6139d9e3 Upgrade the version of mquandalle:jade
v0.4.7 was bugged, see https://github.com/mquandalle/meteor-jade/issues/195
2015-12-26 23:31:21 +01:00
Maxime Quandalle c69f993013 Accelerate the build process
Following a valuable comment from @Slava [0], this commit improves the
build and the reload time of Wekan. It does so by implementing the
following changes:

* Upgrade the meteor build tool to a version which includes a fix to
  an issue with the caching of the dependency resolution [1]. This fix
  will be included in Meteor 1.3, so we won't have to use a
  "special release" anymore;
* Change the stylus package from `mquandalle:stylus` to `stylus` as we
  don't use the libraries included with my (mquandalle) version like
  Jeet or Rupture, and the core package implement the new meteor build
  plugin API with caching. The generated CSS file is slighly different
  mostly mostly because we miss some autoprefixed values but even
  until meteor-core figure out a good way to configure CSS
  autoprefixing, the benefits (better compile time) outweights the
  cons. For record I attached a diff in the generated style [2];
* Upgrade `mquandalle:jade` to a version that implements the build
  plugin caching correctly.

These 3 changes decrease the reload time of about 50% on my computer.

[0]: https://github.com/meteor/meteor/issues/5269#issuecomment-166422201
[1]: https://github.com/meteor/meteor/pull/5747
[2]: https://gist.github.com/mquandalle/e95198626767b56fc63a
2015-12-24 14:39:07 +01:00
Maxime Quandalle f90ac03f6d Release 0.10.0
Closes #425
2015-12-22 22:55:13 +01:00
Maxime Quandalle d6ba734fa9 Release 0.10.0 2015-12-22 22:19:27 +01:00
Maxime Quandalle 94e57dcf71 Pull translations from Transifex 2015-12-22 22:18:55 +01:00
Maxime Quandalle c615d1d273 Remove the import trello card feature
See the following discussion for rationale:

  https://github.com/wekan/wekan/issues/113#issuecomment-163039089
2015-12-22 22:08:01 +01:00
Maxime Quandalle e124ad8ed9 Fix invitation email subject 2015-12-21 23:46:51 +01:00
Maxime Quandalle a762f6dc9d Support card and and drop on mobile web
Fixes #449
2015-12-21 23:01:14 +01:00
Maxime Quandalle 17a2118b38 Don't display sing-in link to connected users 2015-12-21 19:20:27 +01:00
Maxime Quandalle 9b9d21030b Don't publish private boards meta-data to former members
Fixes #302
2015-12-21 18:05:40 +01:00
Maxime Quandalle 8a47cfa4ba Unassign members before removing them from a board
Closes #399
2015-12-21 17:54:21 +01:00
Maxime Quandalle 2cb6195591 Release v0.10.0-rc4 2015-12-19 18:28:04 +01:00
Maxime Quandalle 7c4640bb63 Improve some activitiy messages
Fixes #433
2015-12-19 17:51:56 +01:00
Maxime Quandalle f30c776f20 Fix home header bar
The issue was introduced in 3b2eb0f but was only partially fixed (in
urgency) in 71b9a42. We sould have test to avoid these trivial
regressions! (I guess React will also yelp in this particular case by
removing the need to link the template and the "component", and thus
removing the possibility to break this link)

Fixes #434
2015-12-19 17:39:38 +01:00
Maxime Quandalle 299c429042 Merge pull request #435 from xavierpriour/devel
Export a board to JSON

Fixes #396
2015-12-18 00:35:32 +01:00
Xavier Priour 115ea533f6 Export: improved API routes
- use an explicit "boards" domain: /api/boards/:boardId
- pass authToken as a request parameter: /api/boards/:boardId?authToken=:token
- in the future, same route can be used with authToken set in the Authenticate: header easily
2015-12-17 23:57:28 +01:00
Maxime Quandalle dbb6921faa Merge pull request #444 from floatinghotpot/patch-9
fix board header issue
2015-12-17 14:59:03 +01:00
floatinghotpot d2ac3dc63d fix board headeer issue 2015-12-17 20:38:33 +08:00
Xavier Priour a45a899137 Improved doc on server-side export route 2015-12-17 13:11:33 +01:00
Xavier Priour 43b1c4b576 Merge remote-tracking branch 'upstream/devel' into devel 2015-12-17 11:59:26 +01:00
Xavier Priour 4cea6fca90 Export: include attachments 2015-12-17 11:58:55 +01:00
Xavier Priour 3a52d7d7af Export: add _format field 2015-12-17 10:22:48 +01:00
Maxime Quandalle ce88495d47 Complete the release notes for 0.10 2015-12-17 07:42:09 +01:00
Maxime Quandalle d6f1e61130 Merge pull request #442 from floatinghotpot/mobile-web
This PR improves the UI on devices or windows with small screens.

Fixes #75 
Fixes #437
2015-12-17 07:29:46 +01:00
Liming Xie 354eff9f7b add: support compact mode for mobile web, auto adapt to small screen/window 2015-12-17 14:23:35 +08:00
Xavier Priour d08e1cc45b Export Wekan now server-based with proper auth 2015-12-16 21:58:43 +01:00
Maxime Quandalle 15245a9055 Merge pull request #439 from Zyko0/devel
One click deploy to Scalingo
2015-12-16 20:02:28 +01:00
Xavier Priour efe7c21d57 Export wekan: do not export board.stars 2015-12-16 16:30:48 +01:00
Xavier Priour 0608b90d3b Merge remote-tracking branch 'upstream/devel' into devel 2015-12-16 16:23:58 +01:00
Maxime Quandalle 677e9937e0 Replace reywood:publish-composite by cottz:publish-relations
Since bug #431 is due to publish-composite I tried to fix this package
and propose a pull request but the code was difficult to refactor. I
decided to use @cottz package instead which handled DDP messages in
the correct order.

Fixes #431
2015-12-14 20:23:43 +01:00
bertrand jung 06eff61f99 Add Scalingo one-click deploy 2015-12-14 15:20:16 +01:00
Xavier Priour f5eba16a50 fix eslint 2015-12-13 21:38:22 +01:00
Xavier Priour e304185c23 Merge remote-tracking branch 'upstream/devel' into devel 2015-12-13 20:02:51 +01:00
Xavier Priour 18697d45f6 board export now checks authentication 2015-12-13 20:02:34 +01:00
Xavier Priour 7cfc72da99 export works but no authentication 2015-12-11 19:20:19 +01:00
Maxime Quandalle 0954cff5b4 Release v0.10.0-rc3 2015-12-10 00:47:01 -05:00
Maxime Quandalle 2733c1d3a0 Add a button to move selected cards
This is an alternative to drag and drop to move a set of selected
cards. This feature was available at the list level until I deleted it
in 5bdf91b, so it makes sense to add it back at the multi-selection
level.
2015-12-10 00:34:44 -05:00
Maxime Quandalle 0954ef3e44 Dynamically resize the new card form if the title is too long 2015-12-09 23:20:53 -05:00
Maxime Quandalle 480ef63273 Fix a regression introduced in 71b9a42f
The buttons in the board header were not click-able anymore.
2015-12-09 23:20:44 -05:00
Maxime Quandalle f9f4747a6a Release v0.10-RC2 2015-12-09 19:22:31 -05:00
Maxime Quandalle 8d2c4795a8 Pull translations from Transifex in prepartion of v0.10-RC2 2015-12-09 19:21:56 -05:00
Maxime Quandalle 71b9a42f00 Allow the header bar customization
This commit also provide a way to escape the Shorcuts page on
Sandstorm.
2015-12-09 19:10:26 -05:00
Maxime Quandalle 3b2eb0ffa1 Fix board archive instructions
Fixes #277.
2015-12-09 19:08:17 -05:00
Maxime Quandalle 5bdf91bd05 Remove the move and archive all cards of a list feature
This operation should now be handled using the multi-selection
feature, ie “select all cards” and then move them or click the
“archive selection” button. This new process add an extra click which
I consider reasonable enough for a relatively rare operation -- plus I
want to encourage mutli-selection usage.

Closes #390.
2015-12-09 18:45:55 -05:00
Maxime Quandalle f9a60616df Merge pull request #426 from floatinghotpot/patch-8
bugfix: only care active members, also optimize some code
2015-12-08 19:51:34 -05:00
Xavier Priour f20b5d04f5 export board to Wekan JSON 2015-12-09 00:35:45 +01:00
floatinghotpot 672c21bfe0 bugfix: only care active members, also optimize some code 2015-12-08 16:03:31 +08:00
Maxime Quandalle b719968df5 Release v0.10.0-rc1 2015-12-07 19:26:32 -05:00
Maxime Quandalle 00ee9a8015 Merge branch 'master' into devel 2015-12-07 19:26:19 -05:00
Maxime Quandalle cdcada16a6 Update dependencies
3stack:presence             upgraded from 1.0.4 to 1.0.5
arillo:flow-router-helpers  upgraded from 0.4.5 to 0.4.7
cosmos:browserify           upgraded from 0.8.3 to 0.9.2
fortawesome:fontawesome     upgraded from 4.4.0 to 4.5.0
kadira:blaze-layout         upgraded from 2.2.0 to 2.3.0
kadira:flow-router          upgraded from 2.9.0 to 2.10.0
meteorhacks:fast-render     upgraded from 2.10.0 to 2.11.0
useraccounts:core           upgraded from 1.12.4 to 1.13.0
useraccounts:flow-routing   upgraded from 1.12.4 to 1.13.0
useraccounts:unstyled       upgraded from 1.12.4 to 1.13.0
2015-12-07 19:07:37 -05:00
Maxime Quandalle b33532e5a3 Pull translations from Transifex 2015-12-07 19:04:12 -05:00
Maxime Quandalle 0623c8ea52 Merge pull request #411 from floatinghotpot/patch-4
add: set user preferred lang and allow select lang for user form
2015-12-07 19:02:31 -05:00
Maxime Quandalle d4581afd9b Pull translations from Transifex in preparation for v0.10-RC1 2015-12-06 23:48:54 -05:00
floatinghotpot ec130d4480 add: use user preferred lang for user form, and allow selecting 2015-12-07 12:36:51 +08:00
Maxime Quandalle 149089b32b Complete the release notes for #422
Also rename the changelog from `History.md` to `Changelog.md` as it
seems to be a way more popular convention in open-source projects.
2015-12-06 23:31:11 -05:00
Maxime Quandalle c59b7a6f9c Merge pull request #422 from floatinghotpot/patch-7
add: invite new user to board via email
2015-12-06 23:25:08 -05:00
floatinghotpot 21fa6fdc32 add: optional board description 2015-12-07 11:22:30 +08:00
floatinghotpot 011f53ad08 add: invite user via email, invited user can accept or decline, allow member to quit 2015-12-07 11:15:57 +08:00
Maxime Quandalle d4c5310d65 Merge pull request #421 from floatinghotpot/patch-6
i18n-ize meteor email templates
2015-12-03 19:34:15 -08:00
floatinghotpot 892d1a2d45 i18n-ize meteor email templates 2015-12-04 10:39:51 +08:00
Maxime Quandalle 8d5d7ee678 Merge pull request #418 from xavierpriour/devel
Import Trello: set creation date for older Trello elements
2015-12-02 14:47:32 -08:00
Xavier Priour 32698bcc98 Fix code style 2015-12-02 20:37:12 +01:00
Xavier Priour f639bada5c Import trello: map card author and board admins 2015-12-02 12:37:51 +01:00
Xavier Priour 2057764801 Import trello: map comment author 2015-12-02 11:28:32 +01:00
Xavier Priour 569f8d50ba Merge remote-tracking branch 'upstream/devel' into devel 2015-12-02 09:54:21 +01:00
Xavier Priour 82c59fb85f Fix #417: exception when importing older boards (missing creationDate) 2015-12-02 09:52:30 +01:00
Maxime Quandalle 827663f255 Sync Sandstorm URL and page title with the inner Wekan grain
The page title synchronization required implementing reactivity in the
kadira:dochead package, see https://github.com/kadirahq/meteor-dochead/pull/25

Closes #403.
2015-11-27 16:36:38 -08:00
Maxime Quandalle 875cf0ad56 Merge pull request #410 from floatinghotpot/patch-3
bugfix: 'template.$()' does not accept dom element, but jQuery can
2015-11-27 15:42:15 -08:00
floatinghotpot 1a4ff82680 bugfix: template. does not accept dom elements, but jquery can 2015-11-27 11:55:29 +08:00
Maxime Quandalle 643eb8a7e1 Fix #409
Credits goes to @floatinghotpot, thanks!
2015-11-25 21:55:22 -08:00
Drew DeVault 41aa2f63b5 Add MAIL_FROM environment variable
Otherwise the mail comes from no-reply@meteor.com, which will fail a
lot of spam tests.

Closes #407
2015-11-25 10:12:43 -08:00
Maxime Quandalle f565aed259 Merge GitHub PR #401
I also completed the release notes related to the import feature.

Closes #401
2015-11-25 09:46:30 -08:00
Maxime Quandalle 5763714d22 Enphasize keyboard shortcuts with a dedicated style
Also add release notes related to the #387 merge.

-- Fluctuat nec mergitur
2015-11-25 09:39:29 -08:00
Xavier Priour db90771d9b Fix eslint 2015-11-17 08:56:58 +01:00
Xavier Priour 33193b6f7b code review fixes 2015-11-17 08:52:55 +01:00
Xavier Priour ad27a59e57 Import attachments 2015-11-16 21:41:49 +01:00
Maxime Quandalle da599a19ba Merge GitHub PR #387 2015-11-15 14:22:59 -08:00
Xavier Priour 475bc70621 Fix build 2015-11-14 01:54:59 +01:00
Xavier Priour dd0a6e1a82 Import members: board import 2015-11-14 01:41:02 +01:00
Xavier Priour f6f41270de Import members: working on card import 2015-11-13 15:52:14 +01:00
Xavier Priour a7427b9ae4 merge with /devel 2015-11-13 12:43:34 +01:00
Xavier Priour 3dc70b3ea4 Import members: UI flow ok 2015-11-13 12:35:41 +01:00
floatinghotpot eaf2afb44c add preview attached image, allow upload image from clipboard and drag & drp 2015-11-13 11:13:54 +08:00
Maxime Quandalle cb3bd86396 Improve Sandstorm usernames management
We now use the `preferredHandle` exposed by Sandstorm as source for
the username and append a number if the username is already taken
since we need to ensure username uniqueness (eg 'max', 'max1', 'max2')

Fixes #352
2015-11-11 14:16:40 -08:00
Maxime Quandalle fc82f7227a Complete the release notes for #342 2015-11-08 23:31:08 -08:00
Maxime Quandalle 642ade9dc1 Merge branch 'minicard-editor' into devel 2015-11-08 23:27:37 -08:00
Maxime Quandalle 5d77ad4f6b Finish the minicard editor auto-completion feature
This commit stands on the initial support implemented in #342. We now
avoid error-prone parsing step by adding the member or the label
directly to the card object.

We also added support for `Tab` to completion on our textComplete
component.

Closes #342
2015-11-08 23:17:24 -08:00
Maxime Quandalle a6bd49da9f Update Meteor packages 2015-11-08 21:15:31 -08:00
Maxime Quandalle e551d067b1 Share the useraccounts configuration with the server
The previous users accounts templates configuration only happened on
the client, which was wrong and caused some bugs, for instance an
invalid URL was generated in the reset password e-mail.

Fixes #297
2015-11-02 18:47:06 -08:00
Maxime Quandalle f9cbc1da4c Fix an exception introduced in 41b23f8 2015-11-01 17:21:05 -08:00
Maxime Quandalle 2b134ff7a9 Merge branch 'devel' into minicard-editor
Conflicts:
	client/components/lists/listBody.js
2015-10-31 12:49:58 +01:00
Maxime Quandalle 41b23f88ae Implement fast-render
This required updating 3stack:presence because of the following bug:

  https://github.com/3stack-software/meteor-presence/pull/3
2015-10-30 03:05:43 +01:00
Maxime Quandalle dd3cdf3945 Fix some bugs introduced in aa974aa
Yes Wekan need some tests. Yes I need to stop refactoring my code
when I’m halp-sleeping in my bed at 4am.
2015-10-29 23:17:21 +01:00
Maxime Quandalle e92f67f191 Update eslint-plugin-meteor to 1.7.0
This fixes https://github.com/dferber90/eslint-plugin-meteor/issues/49
2015-10-29 18:47:39 +01:00
Maxime Quandalle 68521fc1c3 Update packages and update Meteor to 1.2.1
Blaze-components had yet another methods rename.
2015-10-29 15:35:33 +01:00
Maxime Quandalle dd10154392 Clean the linting script
This also has the side effect of correcting the `npm test` Unix exit
status number -- which was previously always 0.

We also edit the website URL.
2015-10-29 01:17:23 +01:00
Maxime Quandalle aae5030b53 Merge pull request #370 from dferber90/linter
Add ESLint-plugin-Meteor
2015-10-28 23:36:04 +01:00
Dominik Ferber c9130324f6 Enable more ESLint-plugin-Meteor rules 2015-10-27 18:34:09 +01:00
Dominik Ferber 6e87d50941 Adapt CI 2015-10-27 18:01:44 +01:00
Dominik Ferber 3956a6ec20 Add eslint-plugin-meteor
Add rules for eslint-plugin-meteor.

Use local version of eslint and eslint-plugin-meteor, instead of
relying on global versions. Ensures consistent versions of eslint and
eslint-plugin-meteor for all developers.
2015-10-27 17:40:38 +01:00
Dominik Ferber 3ad672a20b Add missing semicolon 2015-10-27 17:38:04 +01:00
Maxime Quandalle 31b60d82fc Upgrade Meteor to 1.2.1-rc4
This version includes a more complete selection of ES2015 polyfills
that I started used across the code base, for instance by replacing
`$.trim(str)` by `str.trim()`.
2015-10-23 16:56:55 +02:00
Xavier Priour 658ef5ebe1 Merge branch 'devel' into feature/import-board-members 2015-10-23 03:38:38 +02:00
Xavier Priour 027aacb50e Import members: added UI 2015-10-23 03:37:34 +02:00
Maxime Quandalle b3696e1e3b Fix a typo in the card activity
Fixes #366
2015-10-22 18:35:17 +02:00
Maxime Quandalle b9d20e04f2 Display the board name in the page title
Fixes #364
2015-10-22 18:13:16 +02:00
Maxime Quandalle aa974aa54a Prefer ES5 methods over underscore utilities
Since 07cc454 (ie the switch to Meteor 1.2) we includes the `es5-shim`
polyfill to support methods like `Array.prototype.forEach` in a
consistent way across all supported browsers (IE8+).

MDG recently released a blog post recommending the use of these native
methods instead of underscore [0]. We know follow this recommendation.

This commit also favor some ES6 features (argument defaults,
destructing assignment) in places where we didn’t use them.

[0]: http://info.meteor.com/blog/es2015-get-started
2015-10-22 18:13:12 +02:00
Maxime Quandalle 23961ff28a Create a security disclosure process 2015-10-21 17:59:33 +02:00
Maxime Quandalle c6b12dc5ad Upgrade peerlibrary:blaze-components to v0.14
This change includes method renames and others UI related packages
updates.
2015-10-21 04:34:44 +02:00
Maxime Quandalle 9154b06fc3 Upgrade kenton:accounts-sandstorm package to 0.1.6
We now delegates more user attributes sync (avatar and permissions) to
this package instead of doing it ourselves.
2015-10-21 04:26:16 +02:00
Maxime Quandalle 7a5f030cc8 Merge branch 'xavierpriour-devel' into devel
Conflicts:
	models/import.js
2015-10-20 20:06:26 +02:00
Maxime Quandalle 118b434a5a Provide a default date for lists and cards creation date
See https://github.com/wekan/wekan/pull/362#issuecomment-149645497
for motivation.

This commit also contains cosmetic changes to the import Popup and
on the code style to be more consistent with the code base.
2015-10-20 20:02:12 +02:00
Maxime Quandalle f3fc154eb0 Re-implement label deletion
This was not ported during v0.9 re-factor.

Fixes #322
2015-10-20 19:07:24 +02:00
Xavier Priour 8e0ad91191 Import board: map team permission, and refactor code to share with card import 2015-10-19 20:14:29 +02:00
Xavier Priour ec304de811 Import board: check json structure before importing 2015-10-19 12:41:56 +02:00
Xavier Priour 456674f111 Import board: set proper color and modifiedAt dates 2015-10-19 11:46:04 +02:00
Xavier Priour 4540bd36c4 Import board: import comments and log activities 2015-10-19 00:59:50 +02:00
Xavier Priour 469d47cd9f Import board: create board, lists, and cards 2015-10-18 01:02:44 +02:00
Xavier Priour 595d5f97ac Import board: now proper createdAt dates 2015-10-17 19:29:25 +02:00
Xavier Priour 468694a84c Import board: added UI 2015-10-17 18:00:46 +02:00
Maxime Quandalle 6dedf673d5 Prevent duplicate board labels
43de3b8 did prevent empty labels with the same color, but we also want
to prevent label with the same non-empty name and same color because
the rationale is identical.
2015-10-16 17:49:25 +02:00
Maxime Quandalle 15ebfa63c6 Translate the label colors 2015-10-15 00:52:32 +02:00
Maxime Quandalle 944a1065d3 Add some ESLint rules and fix some related issues 2015-10-14 23:50:12 +02:00
Maxime Quandalle 43de3b8a01 Prevent dublicated empty labels of the same color 2015-10-14 23:40:27 +02:00
Maxime Quandalle ab761f1186 Draft v0.10 release notes 2015-10-14 23:30:51 +02:00
Xavier Priour b670a1ab36 Import single card: proper error handling 2015-10-14 23:23:17 +02:00
Xavier Priour 7d57ce896b Import single card: create an 'importCard' activity entry 2015-10-14 23:23:16 +02:00
Xavier Priour 4b99ce2aa2 Import single card: check user authorized 2015-10-14 23:23:16 +02:00
Xavier Priour 81bd551137 Import single card: now uses historical dates 2015-10-14 23:23:16 +02:00
Xavier Priour d8892d6408 Import single card: refactor to meteor method 2015-10-14 23:23:16 +02:00
Xavier Priour 7e64c22c1a Import single card: archived card 2015-10-14 23:23:16 +02:00
Xavier Priour 68518f5497 Import single card: map labels 2015-10-14 23:23:16 +02:00
Xavier Priour 432c1ebb5d Import single card: now with description and comments 2015-10-14 23:23:16 +02:00
Xavier Priour 1b9df00492 Import single card: title and proper sort index 2015-10-14 23:23:16 +02:00
Xavier Priour bc79b83140 Add card import UI 2015-10-14 23:23:16 +02:00
Maxime Quandalle 758be3356c Use a better API to retrieve the new card position
Fixes #347
2015-10-13 19:56:04 +02:00
Maxime Quandalle 3f7df340e1 Set some DOM transformation to fix some of the accessibility issues
See #337 for the complete rationale by @ndarilek -- thank you :)

Closes #338
2015-10-13 19:49:00 +02:00
Maxime Quandalle 1bf9e65571 Remove the Meteor._wrapAsync depreciation warning
This warning was raised by the `cfs:storage-adapter` package and fixed
in https://github.com/CollectionFS/Meteor-CollectionFS/pull/663.
2015-10-13 18:44:46 +02:00
Maxime Quandalle 8bbc69616f Abstract the jquery-textcomplete integration with EscapeActions
We now can re-use this integration in multiple places, this will be
useful for #342 for instance.
2015-10-13 18:36:58 +02:00
Maxime Quandalle e504ac2894 Enforce "public" visibility for Sandstorm boards
Fixes #346
2015-10-13 14:17:53 +02:00
Maxime Quandalle bf46a21405 Fix a typo in a function call introduced in a78debc 2015-10-13 14:10:56 +02:00
Maxime Quandalle 380de21c20 Merge pull request #354 from xavierpriour/devel
Add editorconfig support
2015-10-13 00:04:45 +02:00
Xavier Priour 21dcd162f5 Add editorconfig support 2015-10-12 17:41:09 +02:00
Kenton Hamaluik 3507c6565b Made colours light grey in the labels dropdown 2015-10-10 23:08:50 -06:00
Maxime Quandalle a78debc461 Support app deployment under a path prefix
Fixes #133
2015-10-08 23:28:27 +02:00
Kenton Hamaluik fde2a39ee3 Added coloured label badges in autocomplete list 2015-10-08 13:10:46 -06:00
Kenton Hamaluik f5be121cf3 Pressing escape while autocomplete is open no longer closes the minicard 2015-10-08 12:32:31 -06:00
Kenton Hamaluik c2cb17c5df Now cards with *only* metadata aren't created empty 2015-10-08 12:25:58 -06:00
Kenton Hamaluik a212b1310c Added space after if to conform to formatting 2015-10-08 12:22:55 -06:00
Kenton Hamaluik 77ca52d8c2 Fixed issue with possible race condition, suggested by @mquandalle 2015-10-08 12:22:03 -06:00
Maxime Quandalle c804813e5f Merge pull request #344 from hack1m/devel
Updated to Meteor 1.2.0.2
2015-10-06 00:02:28 +02:00
hack1m 6db8bfc343 updated to Meteor 1.2.0.2 2015-10-05 16:25:27 +08:00
Kenton Hamaluik e4c5d2cbe6 Fixed typo in template for quick-adding a user. 2015-10-03 16:56:27 -06:00
Kenton Hamaluik 429686ef48 Made eslinter happy. 2015-10-03 16:53:45 -06:00
Kenton Hamaluik 8010ed8d6d Added package.json for meteor deployment 2015-10-03 16:38:43 -06:00
Kenton Hamaluik d105da5bc7 Conformed to the 80-character line length limit. 2015-10-03 15:59:13 -06:00
Kenton Hamaluik bfcfd2ebda Initial support for @user and #label use in new cards.
When creating a new [mini]card, typing `@` or `#` brings up an
auto-complete box for board members and labels which will get applied to
the card upon creation. These textual tags are removed from the card
title before saving to maintain sanity. If a label doesn't have a name,
it's colour is used (i.e. `red`, `purple`, etc).

This was developed to ease the creation of new cards and allow users to
rapidly create cards without having to click numerous times just to
apply labels & members.
2015-10-03 15:58:36 -06:00
Maxime Quandalle 57fa7af24c Merge pull request #326 from AlexanderS/fix/display-all-archived
sidebar: Filter archived cards/lists for current board
2015-09-24 15:12:47 +02:00
Alexander Sulfrian b2ab174fd5 sidebar: Filter archived cards/lists for current board
The archived items should be filtered for the current board or else you
will get a global list of all archived items on all boards.
2015-09-24 12:32:48 +02:00
Maxime Quandalle b8403b9c35 Upgrade to Meteor 1.2 2015-09-22 15:24:18 +02:00
Maxime Quandalle 5f239754d6 Merge pull request #317 from AlexanderS/fix/remove-member
Fix removeMemberPopup
2015-09-21 00:36:22 +02:00
Alexander Sulfrian bf8f335ae7 Fix removeMemberPopup
The removeMemberPopup was missing the required helper to get the user and board
information and the user profile field is called "fullname" and not "name".
2015-09-20 23:52:51 +02:00
Maxime Quandalle 33888f9fbb Merge pull request #316 from AlexanderS/fix/delete-card
Fix card deletion

This bug was introduced in b3851817.
2015-09-20 16:57:00 +02:00
Alexander Sulfrian f4a68a0f7d Fix Popup.afterCommit
We need to use "function() {}" instead of the ES6 style "() {}" with
popup.afterCommit because we need the original value of "this" inside
the callback.
2015-09-20 16:49:11 +02:00
Maxime Quandalle 9d5f473395 Merge pull request #314 from fisle/devel
Shortcut: Spacebar assigns self to current card, 'F' toggles filter sidebar
2015-09-19 15:51:46 +02:00
fisle 14b7213af4 Shortcut: F toggles filter sidebar 2015-09-19 16:46:49 +03:00
fisle 119d4b787d Shortcut: Spacebar assigns self to current card 2015-09-19 16:41:41 +03:00
Maxime Quandalle cd9a1094ea Use Travis container-based infrastructure
This option add a few restrictions (in particular `sudo` is disabled)
but makes the process quicker to start and to execute.
2015-09-18 18:05:38 +02:00
Maxime Quandalle ece7354b0c Configure Continuous Integration (CI) for linting rules 2015-09-18 17:37:01 +02:00
Maxime Quandalle b14fd985ff Add some strings to the translation set 2015-09-18 17:37:01 +02:00
Maxime Quandalle 786423ba9d Display “Filter cards” action for non-board members 2015-09-18 17:37:01 +02:00
Maxime Quandalle ec92f84f41 Merge pull request #305 from AlexanderS/fix/multiselect-toggle
Fix multiselect toggle logic

This bug was introduced in 45b662a
2015-09-16 15:35:18 +02:00
Maxime Quandalle 23218d0985 Merge pull request #304 from AlexanderS/fix/redundant-words
Remove redundant words
2015-09-16 15:33:14 +02:00
Alexander Sulfrian 6277bd2a90 Fix multiselect toggle logic
If every element already has the label/member, we do not need to add it
but it should be removed and if every element does not have the element,
we should add it.
2015-09-16 04:30:02 +02:00
Alexander Sulfrian c5c1d06446 Remove redundant words 2015-09-16 04:19:57 +02:00
Maxime Quandalle bc1a576a67 Upgrade Meteor 1.2 to RC 14
This fixes the weird trace reported in #264 and in
https://github.com/meteor/meteor/issues/5107.
2015-09-12 23:44:46 +02:00
Maxime Quandalle dbbdebf313 Bump sandstorm app version 2015-09-11 01:24:44 +02:00
Maxime Quandalle 0f014c954c Merge branch 'master' into devel 2015-09-10 19:25:15 +02:00
Maxime Quandalle d01ffae999 Add some passing ESlint rules 2015-09-08 21:53:35 +02:00
Maxime Quandalle 45b662a1dd Centralize all mutations at the model level
This commit uses a new package that I need to document. It tries to
solve the long-standing debate in the Meteor community about
allow/deny rules versus methods (RPC).

This approach gives us both the centralized security rules of
allow/deny and the white-list of allowed mutations similarly to Meteor
methods. The idea to have static mutation descriptions is also
inspired by Facebook's Relay/GraphQL.

This will allow the development of a REST API using the high-level
methods instead of the MongoDB queries to do the mapping between the
HTTP requests and our collections.
2015-09-08 20:19:42 +02:00
266 changed files with 33733 additions and 3793 deletions

No files matched your search

+10
View File
@@ -0,0 +1,10 @@
# EditorConfig is awesome: http://EditorConfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
-158
View File
@@ -1,158 +0,0 @@
ecmaFeatures:
experimentalObjectRestSpread: true
rules:
indent:
- 2
- 2
semi:
- 2
- always
comma-dangle:
- 2
- always-multiline
no-inner-declarations:
- 0
dot-notation:
- 2
eqeqeq:
- 2
no-eval:
- 2
radix:
- 2
# Stylistic Issues
camelcase:
- 2
comma-spacing:
- 2
comma-style:
- 2
new-parens:
- 2
no-lonely-if:
- 2
no-multiple-empty-lines:
- 2
no-nested-ternary:
- 2
linebreak-style:
- 2
- unix
quotes:
- 2
- single
semi-spacing:
- 2
spaced-comment:
- 2
- always
- markers:
- '/'
space-unary-ops:
- 2
# ECMAScript 6
arrow-parens:
- 2
arrow-spacing:
- 2
no-class-assign:
- 2
no-dupe-class-members:
- 2
no-var:
- 2
object-shorthand:
- 2
prefer-const:
- 2
prefer-template:
- 2
prefer-spread:
- 2
globals:
# Meteor globals
Meteor: false
DDP: false
Mongo: false
Session: false
Accounts: false
Template: false
Blaze: false
UI: false
Match: false
check: false
Tracker: false
Deps: false
ReactiveVar: false
EJSON: false
HTTP: false
Email: false
Assets: false
Handlebars: false
Package: false
App: false
Npm: false
Tinytest: false
Random: false
HTML: false
# Exported by packages we use
'$': false
_: false
autosize: false
Avatar: true
Avatars: true
BlazeComponent: false
BlazeLayout: false
ESSearchResults: false
FlowRouter: false
FS: false
getSlug: false
Migrations: false
Mousetrap: false
Picker: false
Presence: true
presences: true
Ps: true
ReactiveTabs: false
SimpleSchema: false
SubsManager: false
T9n: false
TAPi18n: false
# Our collections
AccountsTemplates: true
Activities: true
Attachments: true
Boards: true
CardComments: true
Cards: true
Lists: true
UnsavedEditCollection: true
Users: true
# Our objects
CSSEvents: true
EscapeActions: true
Filter: true
Filter: true
Mixins: true
Modal: true
MultiSelection: true
Popup: true
Sidebar: true
Utils: true
InlinedForm: true
UnsavedEdits: true
# XXX Temp, we should remove these
allowIsBoardAdmin: true
allowIsBoardMember: true
Emoji: true
env:
es6: true
node: true
browser: true
extends: 'eslint:recommended'
+136
View File
@@ -0,0 +1,136 @@
{
"extends": "eslint:recommended",
"env": {
"es6": true,
"node": true,
"browser": true
},
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"experimentalObjectRestSpread": true
}
},
"rules": {
"strict": 0,
"no-undef": 2,
"accessor-pairs": 2,
"comma-dangle": [2, "always-multiline"],
"consistent-return": 2,
"dot-notation": 2,
"eqeqeq": 2,
"indent": [2, 2],
"no-cond-assign": 2,
"no-constant-condition": 2,
"no-eval": 2,
"no-inner-declarations": [0],
"no-unneeded-ternary": 2,
"radix": 2,
"semi": [2, "always"],
"camelcase": [2, {"properties": "never"}],
"comma-spacing": 2,
"comma-style": 2,
"eol-last": 2,
"linebreak-style": [2, "unix"],
"new-parens": 2,
"no-lonely-if": 2,
"no-multiple-empty-lines": 2,
"no-nested-ternary": 2,
"no-spaced-func": 2,
"no-trailing-spaces": 2,
"operator-linebreak": 2,
"quotes": [2, "single"],
"semi-spacing": 2,
"space-unary-ops": 2,
"arrow-parens": 2,
"arrow-spacing": 2,
"no-class-assign": 2,
"no-dupe-class-members": 2,
"no-var": 2,
"object-shorthand": 2,
"prefer-const": 2,
"prefer-spread": 2,
"prefer-template": 2,
"no-unused-vars" : "warn"
},
"globals": {
"Meteor": false,
"Session": false,
"HTML": false,
"check": false,
"Tracker": false,
"Blaze": false,
"Accounts": false,
"Match": false,
"Mongo": false,
"Random": false,
"ReactiveVar": false,
"Email": false,
"Template": false,
"$": false,
"_": false,
"autosize": false,
"Avatar": true,
"Avatars": true,
"BlazeComponent": false,
"BlazeLayout": false,
"CollectionHooks": false,
"DocHead": false,
"ESSearchResults": false,
"FastRender": false,
"FlowRouter": false,
"FS": false,
"getSlug": false,
"Migrations": false,
"moment": false,
"Mousetrap": false,
"Picker": false,
"Presence": true,
"presences": true,
"Ps": true,
"ReactiveTabs": false,
"Restivus": false,
"SimpleSchema": false,
"SubsManager": false,
"T9n": false,
"TAPi18n": false,
"AccountsTemplates": true,
"Activities": true,
"Attachments": true,
"Boards": true,
"CardComments": true,
"Cards": true,
"Lists": true,
"UnsavedEditCollection": true,
"Users": true,
"CSSEvents": true,
"EscapeActions": true,
"Filter": true,
"Mixins": true,
"Modal": true,
"MultiSelection": true,
"Popup": true,
"Sidebar": true,
"Utils": true,
"InlinedForm": true,
"UnsavedEdits": true,
"Notifications": true,
"allowIsBoardAdmin": true,
"allowIsBoardMember": true,
"allowIsBoardMemberByCard": true,
"allowIsBoardMemberNonComment": true,
"Emoji": true,
"Checklists": true,
"Settings": true,
"InvitationCodes": true,
"JsonRoutes": true,
"Authentication": true,
"Integrations": true,
"HTTP": true,
"AccountSettings": true,
"Announcements": true,
"Swimlanes": true,
"Npm": true
}
}
+16
View File
@@ -0,0 +1,16 @@
## Issue
**Impacted version**: xxxx
**Server Setup Information**:
* Operating System:
* Deployment Method(tar/sandstorm/snap/docker/etc /http frontend (nginx, httpd, ...)):
* Node Version:
* MongoDB Version:
* ROOT_URL environment variable (Is there a subfolder?):
**Problem description**:
- *be as explicit as you can*
- *describe the problem and its symptoms*
- *explain how to reproduce*
- *attach whatever information that can help understanding the context (screen capture, log files)*
+12 -1
View File
@@ -1,6 +1,17 @@
*~
*.swp
.meteor-spk
.tx/
*.sublime-workspace
tmp/
node_modules/
.vscode/
.idea/
.build/*
packages/kadira-flow-router/
packages/meteor-useraccounts-core/
package-lock.json
**/parts/
**/stage
**/prime
**/*.snap
snap/.snapcraft/
+10
View File
@@ -6,3 +6,13 @@ notices-for-0.9.0
notices-for-0.9.1
0.9.4-platform-file
notices-for-facebook-graph-api-2
1.2.0-standard-minifiers-package
1.2.0-meteor-platform-split
1.2.0-cordova-changes
1.2.0-breaking-changes
1.3.0-split-minifiers-package
1.3.5-remove-old-dev-bundle-link
1.4.0-remove-old-dev-bundle-link
1.4.1-add-shell-server-package
1.4.3-split-account-service-packages
1.5-add-dynamic-import-package
+1
View File
@@ -1 +1,2 @@
dev_bundle
local
-1
View File
@@ -1 +0,0 @@
+36 -26
View File
@@ -2,54 +2,50 @@
#
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
#
# XXX Should we replace tmeasday:presence by 3stack:presence? Or maybe the
# packages will merge in the future?
meteor-base
meteor-base@1.2.0
# Build system
ecmascript
standard-minifiers
ecmascript@0.9.0
stylus@2.513.13
standard-minifier-css@1.3.5
standard-minifier-js@2.2.0
mquandalle:jade
mquandalle:stylus
# Polyfills
es5-shim
es5-shim@4.6.15
# Collections
mongo
aldeed:collection2
cfs:gridfs
cfs:standard-packages
cottz:publish-relations
dburles:collection-helpers
idmontie:migrations
matb33:collection-hooks
matteodem:easy-search
reywood:publish-composite
mongo@1.3.1
mquandalle:collection-mutations
# Account system
accounts-password
kenton:accounts-sandstorm
service-configuration
useraccounts:core
service-configuration@1.0.11
useraccounts:unstyled
useraccounts:flow-routing
# Utilities
check
jquery
random
reactive-dict
session
tracker
underscore
check@1.2.5
jquery@1.11.10
random@1.0.10
reactive-dict@1.2.0
session@1.1.7
tracker@1.1.3
underscore@1.0.10
3stack:presence
alethes:pages
arillo:flow-router-helpers
audit-argument-checks
audit-argument-checks@1.0.7
kadira:blaze-layout
kadira:flow-router
kadira:dochead
meteorhacks:picker
meteorhacks:subs-manager
mquandalle:autofocus
@@ -57,18 +53,32 @@ mquandalle:moment
ongoworks:speakingurl
raix:handlebar-helpers
tap:i18n
http@1.3.0
# UI components
blaze
reactive-var
reactive-var@1.0.11
fortawesome:fontawesome
mousetrap:mousetrap
mquandalle:jquery-textcomplete
mquandalle:jquery-ui-drag-drop-sort
mquandalle:mousetrap-bindglobal
mquandalle:perfect-scrollbar
peerlibrary:blaze-components
peerlibrary:blaze-components@=0.15.1
perak:markdown
seriousm:emoji-continued
templates:tabs
verron:autosize
simple:json-routes
rajit:bootstrap3-datepicker
shell-server@0.3.0
simple:rest-accounts-password
useraccounts:core
email@1.2.3
horka:swipebox
dynamic-import@0.2.0
staringatlights:fast-render
staringatlights:flow-router
mixmax:smart-disconnect
accounts-password@1.5.0
cfs:gridfs
+1 -1
View File
@@ -1 +1 @@
METEOR@1.2-rc.12
METEOR@1.6.0.1
+144 -112
View File
@@ -1,140 +1,172 @@
3stack:presence@1.0.3
accounts-base@1.2.1-rc.2
accounts-password@1.1.2-rc.1
aldeed:collection2@2.5.0
aldeed:simple-schema@1.3.3
alethes:pages@1.8.4
arillo:flow-router-helpers@0.4.5
audit-argument-checks@1.0.4-rc.0
autoupdate@1.2.3-rc.1
babel-compiler@5.8.22-rc.1
babel-runtime@0.1.4-rc.0
base64@1.0.4-rc.0
binary-heap@1.0.4-rc.0
blaze@2.1.3-rc.0
blaze-tools@1.0.4-rc.0
boilerplate-generator@1.0.4-rc.1
caching-compiler@1.0.0-rc.0
caching-html-compiler@1.0.1-rc.0
callback-hook@1.0.4-rc.0
3stack:presence@1.1.2
accounts-base@1.4.0
accounts-password@1.5.0
aldeed:collection2@2.10.0
aldeed:collection2-core@1.2.0
aldeed:schema-deny@1.1.0
aldeed:schema-index@1.1.1
aldeed:simple-schema@1.5.3
alethes:pages@1.8.6
allow-deny@1.1.0
arillo:flow-router-helpers@0.5.2
audit-argument-checks@1.0.7
autoupdate@1.3.12
babel-compiler@6.24.7
babel-runtime@1.1.1
base64@1.0.10
binary-heap@1.0.10
blaze@2.3.2
blaze-tools@1.0.10
boilerplate-generator@1.3.1
caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
cfs:access-point@0.1.49
cfs:base-package@0.0.30
cfs:collection@0.5.5
cfs:collection-filters@0.2.4
cfs:data-man@0.0.6
cfs:file@0.1.17
cfs:gridfs@0.0.33
cfs:http-methods@0.0.29
cfs:gridfs@0.0.34
cfs:http-methods@0.0.32
cfs:http-publish@0.0.13
cfs:power-queue@0.9.11
cfs:reactive-list@0.0.9
cfs:reactive-property@0.0.4
cfs:standard-packages@0.5.9
cfs:storage-adapter@0.2.2
cfs:storage-adapter@0.2.3
cfs:tempstore@0.1.5
cfs:upload-http@0.0.20
cfs:worker@0.1.4
check@1.0.6-rc.0
coffeescript@1.0.8-rc.3
cosmos:browserify@0.5.0
dburles:collection-helpers@1.0.3
ddp@1.2.1-rc.0
ddp-client@1.2.1-rc.1
ddp-common@1.2.1-rc.0
ddp-rate-limiter@1.0.0-rc.0
ddp-server@1.2.1-rc.1
deps@1.0.8-rc.0
diff-sequence@1.0.1-rc.0
ecmascript@0.1.3-rc.2
ecmascript-collections@0.1.5-rc.1
ejson@1.0.7-rc.0
email@1.0.7-rc.0
es5-shim@0.1.0-rc.0
fastclick@1.0.7-rc.0
fortawesome:fontawesome@4.4.0
geojson-utils@1.0.4-rc.0
hot-code-push@1.0.0-rc.0
html-tools@1.0.5-rc.0
htmljs@1.0.5-rc.1
http@1.1.1-rc.1
id-map@1.0.4-rc.0
idmontie:migrations@1.0.0
jquery@1.11.4-rc.0
kadira:blaze-layout@2.1.0
kadira:flow-router@2.5.0
kenton:accounts-sandstorm@0.1.4
launch-screen@1.0.3-rc.1
less@2.5.0-rc.3_1
livedata@1.0.14-rc.0
localstorage@1.0.4-rc.0
logging@1.0.8-rc.1
matb33:collection-hooks@0.8.0
matteodem:easy-search@1.6.3
meteor@1.1.7-rc.1
meteor-base@1.0.1-rc.0
meteor-platform@1.2.3-rc.0
check@1.2.5
chuangbo:cookie@1.1.0
coffeescript@1.12.7_3
coffeescript-compiler@1.12.7_3
cottz:publish-relations@2.0.8
dburles:collection-helpers@1.1.0
ddp@1.4.0
ddp-client@2.2.0
ddp-common@1.3.0
ddp-rate-limiter@1.0.7
ddp-server@2.1.1
deps@1.0.12
diff-sequence@1.0.7
dynamic-import@0.2.1
ecmascript@0.9.0
ecmascript-runtime@0.5.0
ecmascript-runtime-client@0.5.0
ecmascript-runtime-server@0.5.0
ejson@1.1.0
email@1.2.3
es5-shim@4.6.15
fastclick@1.0.13
fortawesome:fontawesome@4.7.0
geojson-utils@1.0.10
horka:swipebox@1.0.2
hot-code-push@1.0.4
html-tools@1.0.11
htmljs@1.0.11
http@1.3.0
id-map@1.0.9
idmontie:migrations@1.0.3
jquery@1.11.10
kadira:blaze-layout@2.3.0
kadira:dochead@1.5.0
kadira:flow-router@2.12.1
kenton:accounts-sandstorm@0.7.0
launch-screen@1.1.1
livedata@1.0.18
localstorage@1.2.0
logging@1.1.19
matb33:collection-hooks@0.8.4
matteodem:easy-search@1.6.4
mdg:validation-error@0.5.1
meteor@1.8.2
meteor-base@1.2.0
meteor-platform@1.2.6
meteorhacks:aggregate@1.3.0
meteorhacks:collection-utils@1.2.0
meteorhacks:meteorx@1.4.1
meteorhacks:picker@1.0.3
meteorhacks:subs-manager@1.6.2
meteorhacks:subs-manager@1.6.4
meteorspark:util@0.2.0
minifiers@1.1.6-rc.1
minimongo@1.0.9-rc.0
mobile-status-bar@1.0.5-rc.1
mongo@1.1.1-rc.3
mongo-id@1.0.1-rc.0
mongo-livedata@1.0.9-rc.0
minifier-css@1.2.16
minifier-js@2.2.2
minifiers@1.1.8-faster-rebuild.0
minimongo@1.4.3
mixmax:smart-disconnect@0.0.4
mobile-status-bar@1.0.14
modules@0.11.0
modules-runtime@0.9.1
mongo@1.3.1
mongo-dev-server@1.1.0
mongo-id@1.0.6
mongo-livedata@1.0.12
mousetrap:mousetrap@1.4.6_1
mquandalle:autofocus@1.0.0
mquandalle:jade@0.4.3_1
mquandalle:jade-compiler@0.4.3
mquandalle:jquery-textcomplete@0.3.9_1
mquandalle:jquery-ui-drag-drop-sort@0.1.0
mquandalle:moment@1.0.0
mquandalle:collection-mutations@0.1.0
mquandalle:jade@0.4.9
mquandalle:jade-compiler@0.4.5
mquandalle:jquery-textcomplete@0.8.0_1
mquandalle:jquery-ui-drag-drop-sort@0.2.0
mquandalle:moment@1.0.1
mquandalle:mousetrap-bindglobal@0.0.1
mquandalle:perfect-scrollbar@0.6.5_2
mquandalle:stylus@1.1.1
npm-bcrypt@0.7.8_2
npm-mongo@1.4.39-rc.0_1
observe-sequence@1.0.7-rc.0
npm-bcrypt@0.9.3
npm-mongo@2.2.33
observe-sequence@1.0.16
ongoworks:speakingurl@1.1.0
ordered-dict@1.0.4-rc.0
ordered-dict@1.0.9
peerlibrary:assert@0.2.5
peerlibrary:base-component@0.10.0
peerlibrary:blaze-components@0.13.0
peerlibrary:base-component@0.16.0
peerlibrary:blaze-components@0.15.1
peerlibrary:computed-field@0.7.0
peerlibrary:reactive-field@0.3.0
perak:markdown@1.0.5
promise@0.4.8-rc.0
promise@0.10.0
raix:eventemitter@0.1.3
raix:handlebar-helpers@0.2.4
random@1.0.4-rc.0
rate-limit@1.0.0-rc.0
reactive-dict@1.1.1-rc.0
reactive-var@1.0.6-rc.0
reload@1.1.4-rc.0
retry@1.0.4-rc.0
reywood:publish-composite@1.4.2
routepolicy@1.0.6-rc.0
seriousm:emoji-continued@1.4.0
service-configuration@1.0.5-rc.0
session@1.1.1-rc.0
sha@1.0.4-rc.0
softwarerero:accounts-t9n@1.1.4
spacebars@1.0.7-rc.0
spacebars-compiler@1.0.7-rc.0
srp@1.0.4-rc.0
standard-minifiers@1.0.0-rc.1
tap:i18n@1.5.1
templates:tabs@2.2.0
templating@1.1.2-rc.4
templating-tools@1.0.0-rc.0
tracker@1.0.8-rc.0
ui@1.0.7-rc.0
underscore@1.0.4-rc.0
url@1.0.5-rc.0
useraccounts:core@1.12.3
useraccounts:flow-routing@1.12.3
useraccounts:unstyled@1.12.3
raix:handlebar-helpers@0.2.5
rajit:bootstrap3-datepicker@1.7.1
random@1.0.10
rate-limit@1.0.8
reactive-dict@1.2.0
reactive-var@1.0.11
reload@1.1.11
retry@1.0.9
routepolicy@1.0.12
service-configuration@1.0.11
session@1.1.7
sha@1.0.9
shell-server@0.3.1
simple:authenticate-user-by-token@1.0.1
simple:json-routes@2.1.0
simple:rest-accounts-password@1.1.2
simple:rest-bearer-token-parser@1.0.1
simple:rest-json-error-handler@1.0.1
softwarerero:accounts-t9n@1.3.11
spacebars@1.0.15
spacebars-compiler@1.1.3
srp@1.0.10
standard-minifier-css@1.3.5
standard-minifier-js@2.2.3
staringatlights:fast-render@2.16.5
staringatlights:flow-router@2.12.2
staringatlights:inject-data@2.0.5
stylus@2.513.13
tap:i18n@1.8.2
templates:tabs@2.3.0
templating@1.3.2
templating-compiler@1.3.3
templating-runtime@1.3.2
templating-tools@1.1.2
tracker@1.1.3
ui@1.0.13
underscore@1.0.10
url@1.1.0
useraccounts:core@1.14.2
useraccounts:flow-routing@1.14.2
useraccounts:unstyled@1.14.2
verron:autosize@3.0.8
webapp@1.2.2-rc.2
webapp-hashing@1.0.4-rc.0
webapp@1.4.0
webapp-hashing@1.0.9
zimme:active-route@2.3.2
+32
View File
@@ -0,0 +1,32 @@
dist: trusty
sudo: required
env:
TRAVIS_DOCKER_COMPOSE_VERSION: 1.17.0
TRAVIS_NODE_VERSION: 8.9.3
TRAVIS_NPM_VERSION: 5.5.1
before_install:
- sudo apt-get update -y
- npm install -g npm@${TRAVIS_NPM_VERSION}
- sudo curl -fsSL https://get.docker.com/ | sh
- if [ -e /usr/local/bin/docker-compose ]; then sudo rm /usr/local/bin/docker-compose; fi
- sudo curl -L https://github.com/docker/compose/releases/download/${TRAVIS_DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
- sudo chmod +x docker-compose
- sudo mv docker-compose /usr/local/bin
- sudo docker-compose build --no-cache --force-rm
- sudo docker-compose up -d wekandb
- sudo docker-compose up -d wekan
# ^^ Note - need to come up with some way of checking the output from docker run
# that it was a success... perhaps the nodejs server can output a success message?
language: node_js
node_js:
- "${TRAVIS_NODE_VERSION}"
install:
- "npm install"
script:
- "npm test"
+55
View File
@@ -0,0 +1,55 @@
# This is the configuration of the Transifex tool that we use to manage the
# translations on Wekan. Documentation at: http://docs.transifex.com/client.
#
# Push
# ====
#
# It is recommended that contributors use the Transifex web UI to create and
# edit translated strings. However in case a contributor has directly jumped
# into the code and made its translations in the corresponding i18n.json file
# we can push it using
#
# > tx push -t -l ar
#
# Where `ar` is the language identifier. In addition, the project maintainer
# should push the English source file to Transifex at least before each release
# candidate using:
#
# > tx push -s
#
# Pull
# ====
#
# The set of accepted language is directly managed in Transifex, the only
# restriction we define to bundle a new language in the application, is that its
# completion is at least at 75%.
#
# We use:
#
# > tx pull
#
# to download new versions of existing translations, and
#
# > tx pull -a --minimum-perc=75
#
# to download new sufficiently advanced translations.
[main]
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 = bg_BG:bg, en_GB:en-GB, es_AR:es-AR, el_GR:el, fi_FI:fi, hu_HU:hu, id_ID:id, mn_MN:mn, no:nb, lv_LV:lv, pt_BR:pt-BR, ro_RO:ro, zh_CN:zh-CN, zh_TW:zh-TW
[wekan.application]
file_filter = i18n/<lang>.i18n.json
source_lang = en
type = KEYVALUEJSON
# We might have a dedicated second resource later to translate the “Welcome
# Board” data.
#
# [wekan.welcomeBoard]
# file_filter = private/welcomeBoard/<lang>.json
# source_lang = en
# type = KEYVALUEJSON
+12
View File
@@ -0,0 +1,12 @@
{
"editor.tabSize": 2,
"editor.rulers": [80],
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
"files.exclude": {
"**/.git": true,
"**/.DS_Store": true,
"node_modules": true,
".meteor/local": true
}
}
+1160
View File
File diff suppressed because it is too large. Load diff
+2 -53
View File
@@ -1,56 +1,5 @@
# Contributing
We’re glad you’re interested in helping the Wekan project! We welcome bug
reports, enhancement ideas, and pull requests, in our GitHub bug tracker. Before
opening a new thread please verify that your issue hasn’t already been reported.
Please see wiki for all documentation:
<https://github.com/wekan/wekan>
## Translations
You are encouraged to translate (or improve the translation of) Wekan in your
locale language. For that purpose we rely on
[Transifex](https://www.transifex.com/projects/p/wekan). So the first step is to
create a Transifex account if you don’t have one already. You can then send a
request to join one of the translation teams. If there we will create a new one.
Once you are in a team you can start translating the application. Please take a
look at the glossary so you can agree with other (present and future)
contributors on words to use to translate key concepts in the application like
“boards” and “cards”.
The original application is written in English, and if you want to contribute to
the application itself, you are asked to fill the `i18n/en.i18n.json` file. When
you do that the new strings of text to translate automatically appears on
Transifex to be translated (the refresh may take a few hours).
We pull all translations from Transifex before every new Wekan release
candidate, ask the translators to review the app, and pull all translations
again for the final release.
## Installation
Wekan is made with [Meteor](https://www.meteor.com). Thus the easiest way to
start hacking is by installing the framework, cloning the git repository, and
launching the application:
```bash
$ curl https://install.meteor.com/ | sh # On Mac or Linux
$ git clone https://github.com/wekan/wekan.git
$ cd wekan
$ meteor
```
As for any Meteor application, Wekan is automatically refreshed when you change
any file of the source code, just play with it to see how it behaves!
## Style guide
We follow the
[meteor style guide](https://github.com/meteor/meteor/wiki/Meteor-Style-Guide).
Please read the meteor style guide before making any significant contribution.
## Code organisation
TODO
<https://github.com/wekan/wekan/wiki>
+133 -6
View File
@@ -1,7 +1,134 @@
FROM meteorhacks/meteord:onbuild
MAINTAINER Maxime Quandalle <maxime@quandalle.com>
FROM debian:buster-slim
MAINTAINER wekan
# Run as you wish!
# docker run -d --name wekan-db mongo
# docker run -d --link "wekan-db:db" -e "MONGO_URL=mongodb://db" \
# -e "ROOT_URL=http://example.com" -p 8080:80 mquandalle/wekan
# Declare Arguments
ARG NODE_VERSION
ARG METEOR_RELEASE
ARG METEOR_EDGE
ARG USE_EDGE
ARG NPM_VERSION
ARG FIBERS_VERSION
ARG ARCHITECTURE
ARG SRC_PATH
# Set the environment variables (defaults where required)
# paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
ENV BUILD_DEPS="apt-utils gnupg gosu wget curl bzip2 build-essential python git ca-certificates gcc-7 paxctl"
ENV NODE_VERSION ${NODE_VERSION:-v8.9.3}
ENV METEOR_RELEASE ${METEOR_RELEASE:-1.6.0.1}
ENV USE_EDGE ${USE_EDGE:-false}
ENV METEOR_EDGE ${METEOR_EDGE:-1.5-beta.17}
ENV NPM_VERSION ${NPM_VERSION:-5.5.1}
ENV FIBERS_VERSION ${FIBERS_VERSION:-2.0.0}
ENV ARCHITECTURE ${ARCHITECTURE:-linux-x64}
ENV SRC_PATH ${SRC_PATH:-./}
# Copy the app to the image
COPY ${SRC_PATH} /home/wekan/app
RUN \
# Add non-root user wekan
useradd --user-group --system --home-dir /home/wekan wekan && \
\
# OS dependencies
apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
\
# Download nodejs
wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \
\
# Verify nodejs authenticity
grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
export GNUPGHOME="$(mktemp -d)" && \
\
# Try other key servers if ha.pool.sks-keyservers.net is unreachable
# Code from https://github.com/chorrell/docker-node/commit/2b673e17547c34f17f24553db02beefbac98d23c
# gpg keys listed at https://github.com/nodejs/node#release-team
# and keys listed here from previous version of this Dockerfile
for key in \
9554F04D7259F04124DE6B476D5A82AC7E37093B \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
; do \
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" || \
gpg --keyserver pgp.mit.edu --recv-keys "$key" || \
gpg --keyserver keyserver.pgp.com --recv-keys "$key" ; \
done && \
gpg --verify SHASUMS256.txt.asc && \
# Ignore socket files then delete files then delete directories
find "$GNUPGHOME" -type f | xargs rm -f && \
find "$GNUPGHOME" -type d | xargs rm -fR && \
rm -f SHASUMS256.txt.asc && \
\
# Install Node
tar xvzf node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
rm node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
ln -s /opt/nodejs/bin/node /usr/bin/node && \
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
\
# paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
paxctl -mC `which node` && \
\
# Install Node dependencies
npm install -g npm@${NPM_VERSION} && \
npm install -g node-gyp && \
npm install -g fibers@${FIBERS_VERSION} && \
\
# Change user to wekan and install meteor
cd /home/wekan/ && \
chown wekan:wekan --recursive /home/wekan && \
curl https://install.meteor.com -o /home/wekan/install_meteor.sh && \
sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
chown wekan:wekan /home/wekan/install_meteor.sh && \
\
# Check if opting for a release candidate instead of major release
if [ "$USE_EDGE" = false ]; then \
gosu wekan:wekan sh /home/wekan/install_meteor.sh; \
else \
gosu wekan:wekan git clone --recursive --depth 1 -b release/METEOR@${METEOR_EDGE} git://github.com/meteor/meteor.git /home/wekan/.meteor; \
fi; \
\
# Get additional packages
mkdir -p /home/wekan/app/packages && \
chown wekan:wekan --recursive /home/wekan && \
cd /home/wekan/app/packages && \
gosu wekan:wekan git clone --depth 1 -b master git://github.com/wekan/flow-router.git kadira-flow-router && \
gosu wekan:wekan git clone --depth 1 -b master git://github.com/meteor-useraccounts/core.git meteor-useraccounts-core && \
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js && \
cd /home/wekan/.meteor && \
gosu wekan:wekan /home/wekan/.meteor/meteor -- help; \
\
# Build app
cd /home/wekan/app && \
gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js && \
gosu wekan:wekan /home/wekan/.meteor/meteor npm install && \
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
chown wekan:wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
cd /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt && \
gosu wekan:wekan rm -rf node_modules/bcrypt && \
gosu wekan:wekan npm install bcrypt && \
cd /home/wekan/app_build/bundle/programs/server/ && \
gosu wekan:wekan npm install && \
gosu wekan:wekan npm install bcrypt && \
mv /home/wekan/app_build/bundle /build && \
\
# Cleanup
apt-get remove --purge -y ${BUILD_DEPS} && \
apt-get autoremove -y && \
rm -R /var/lib/apt/lists/* && \
rm -R /home/wekan/.meteor && \
rm -R /home/wekan/app && \
rm -R /home/wekan/app_build && \
rm /home/wekan/install_meteor.sh
ENV PORT=80
EXPOSE $PORT
CMD ["node", "/build/main.js"]
-79
View File
@@ -1,79 +0,0 @@
# NEXT — v0.9
This release is a large re-write of the previous code base. Despite being
relatively similar to v0.8 feature-wise, this release marks the beginning of our
new user interface and continues to improve the overall performance and
security. It also features the following improvements:
* A new user account system, including the possibility to reset a forgotten
password, to change the password, or to enable email confirmation (all of
which were previously impossible);
* Avatar customization, including the possibility to upload images and to choose
one from Gravatar or the user initials (on Sandstrom we use the avatar exposed
by Sandstorm);
* Cards multi-selection to facilitate batch actions such as moving all the cards
of selection, or attaching a label or a member to them;
* Automatic drafts saving synced with the server;
* Keyboard navigation, press `?` to read the list of available shortcuts;
* The possibility to restore archived boards, lists, and cards.
Starting from this release we will also distribute official docker images on
both the [GitHub release page](https://github.com/wekan/wekan/releases) and on
the [DockerHub](https://hub.docker.com/r/mquandalle/wekan). We also configured
Heroku one-click install and improved Sandstorm integration with the integration
of its build-in sharing model.
New languages supported: Chinese, Finnish, Spanish, Korean, and Russian.
Special thanks to GitHub users ePirat, nata-goddanti, ocdtrekkie, and others who
have supportive during this *traversée du desert*, and to neynah for the Wekan
icons.
# v0.8
This release continues the implementation of basic features of a “kanban”
software, especially:
* Basic card attachments. If the attached file is an image we generate and
display a thumbnail that can be used as a card “cover” (visible in the board
general view);
* User names mentions and auto-completion in card description and comments
(though we don’t have any notification system for now, making this feature a
less useful that it should);
* Filter views, current filtering options are based on labels and assigned
members;
* Labels creation and suppression at the board level (previously we had a fixed
list of labels);
* Customization of the board background color.
This release is also the first one to introduce localization of the user
interface.
New languages supported: French, German, Japanese, Portuguese, and Turkish.
# v0.7.1
This release fixes the following bugs:
* Unexpected lost of the card sorting on the server side;
* Fix a bug during board creation;
* Focus the new list form if the board is empty.
# v0.7
This release starts the transition from a toy project to something useful. Along
with some security and performance improvements (for instance, opening a card
used to take a long time because it was re-generated the entire DOM whereas only
the popover was new). New features includes:
* Add and remove labels to cards;
* Assign and unassign members to cards;
* Archive cards (though restoration is not yet possible);
* Board stars;
* Markdown and emojies support in comments and card description;
* Emojies auto-completion in the text editor;
* Some keyboard shortcuts (eg `Ctrl`+`Enter` to submit a multi-line input).
We also introduced basic support for the [Sandstorm](https://sandstorm.io)
platform, and distribute a `spk` (Sandstorm PacKage) for this release and
subsequent.
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2014-2015 Yasar Icli, Maxime Quandalle
Copyright (c) 2014-2018 The Wekan Team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+84 -20
View File
@@ -1,8 +1,24 @@
# Wekan
[![Join the chat][gitter_badge]][gitter_chat]
[![Docker Repository on Quay](https://quay.io/repository/wekan/wekan/status "Docker Repository on Quay")](https://quay.io/repository/wekan/wekan)
Wekan is an open-source and collaborative kanban board application.
<!--
[![Wekan Build Status][travis_badge]][travis_status]
-->
Freenode IRC #wekan
[![Wekan chat][vanila_badge]][vanila_chat]
[Translate Wekan at Transifex][translate_wekan]
[Open Hub analysis of Wekan code](https://www.openhub.net/p/wekan)
Please read [FAQ](https://github.com/wekan/wekan/wiki/FAQ).
Please don't feed the trolls and spammers that are mentioned in the FAQ :)
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, or working in a team on your next revolutionary idea, Kanban
@@ -10,29 +26,77 @@ boards are an unbeatable tool to keep your things organized. They give you a
visual overview of the current state of your project, and make you productive by
allowing you to focus on the few items that matter the most.
[![Our roadmap is self-hosted on Wekan][screenshot]][roadmap]
Wekan has real-time user interface. Not all features are implemented.
Wekan supports most features you would expect of it including a real-time user
interface, cards comments, member assignations, customizable labels, filtered
views, and more.
[Features][features]
Since it is a free software, you don’t have to trust us with your data and can
Wekan supports many [Platforms][platforms], and plan is to add more.
[Integrations][integrations]
[Team](https://github.com/wekan/wekan/wiki/Team)
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.
## Roadmap
[Roadmap](https://github.com/wekan/wekan/wiki/Roadmap)
Upcoming Wekan App Development Platform will make possible
many use cases. If you don't find your feature or integration in
GitHub issues and [Features][features] or [Integrations][integrations]
page at wiki, please add them.
We are very welcoming to new developers and teams to submit new pull
requests to devel branch to make this Wekan App Development Platform possible
faster. Please see [Developer Documentation][dev_docs] to get started.
We also welcome sponsors for features, although we don't have any yet.
By working directly with Wekan you get the benefit of active maintenance
and new features added by growing Wekan developer community.
Actual work happens at [Wekan GitHub issues][wekan_issues].
See [Development links on Wekan
wiki](https://github.com/wekan/wekan/wiki#Development)
bottom of the page for more info.
## Demo
[Wekan demo][roadmap_wefork]
## Screenshot
[More screenshots at Features page](https://github.com/wekan/wekan/wiki/Features)
[![Screenshot of Wekan][screenshot_wefork]][roadmap_wefork]
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 Heroku or [Sandstorm]
[sandstorm_market] platforms and verified [Docker][docker_image] images.
that by providing one-click installation on various platforms.
[![Deploy][heroku_button]][heroku_deploy]
## License
Wekan is released under the very permissive [MIT license](LICENSE), and made
with [Meteor](https://www.meteor.com).
[Our roadmap is self-hosted on Wekan][roadmap]
[screenshot]: http://i.imgur.com/cI4jW2h.png
[gitter_badge]: https://badges.gitter.im/Join%20Chat.svg
[gitter_chat]: https://gitter.im/wekan/wekan
[roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap
[sandstorm_market]: https://oasis.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h
[docker_image]: https://hub.docker.com/r/mquandalle/wekan/
[heroku_button]: https://www.herokucdn.com/deploy/button.png
[heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wekan/wekan/tree/master
[platforms]: https://github.com/wekan/wekan/wiki/Platforms
[dev_docs]: https://github.com/wekan/wekan/wiki/Developer-Documentation
[screenshot_wekan]: http://i.imgur.com/cI4jW2h.png
[screenshot_wefork]: https://wekan.github.io/wekan-markdown.png
[features]: https://github.com/wekan/wekan/wiki/Features
[integrations]: https://github.com/wekan/wekan/wiki/Integrations
[roadmap_wekan]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap
[roadmap_wefork]: https://wekan.indie.host/b/t2YaGmyXgNkppcFBq/wekan-fork-roadmap
[wekan_issues]: https://github.com/wekan/wekan/issues
[wefork_issues]: https://github.com/wefork/wekan/issues
[docker_image]: https://hub.docker.com/r/wekanteam/wekan/
[travis_badge]: https://travis-ci.org/wekan/wekan.svg?branch=devel
[travis_status]: https://travis-ci.org/wekan/wekan
[wekan_wiki]: https://github.com/wekan/wekan/wiki
[translate_wekan]: https://www.transifex.com/wekan/wekan/
[open_source]: https://en.wikipedia.org/wiki/Open-source_software
[free_software]: https://en.wikipedia.org/wiki/Free_software
[vanila_badge]: https://vanila.io/img/join-chat-button2.png
[vanila_chat]: https://chat.vanila.io/channel/wekan
Executable
+3
View File
@@ -0,0 +1,3 @@
#!/bin/bash
export PACKAGE_DIRS="$(pwd)/packages"
+1 -1
View File
@@ -4,7 +4,7 @@
"repository": "https://github.com/wekan/wekan",
"logo": "https://raw.githubusercontent.com/wekan/wekan/master/meta/icons/wekan-150.png",
"keywords": ["productivity", "tool", "team", "kanban"],
"website": "http://wekan.io",
"website": "https://wekan.github.io",
"env": {
"BUILDPACK_URL": "https://github.com/AdmitHub/meteor-buildpack-horse.git",
"ROOT_URL": {
+85 -43
View File
@@ -14,55 +14,85 @@ template(name="boardActivities")
p.activity-desc
+memberName(user=user)
if($eq activityType 'createBoard')
| {{_ 'activity-created' boardLabel}}.
if($eq activityType 'createList')
| {{_ 'activity-added' list.title boardLabel}}.
if($eq activityType 'archivedList')
| {{_ 'activity-archived' list.title}}.
if($eq activityType 'createCard')
| {{{_ 'activity-added' cardLink boardLabel}}}.
if($eq activityType 'archivedCard')
| {{{_ 'activity-archived' cardLink}}}.
if($eq activityType 'restoredCard')
| {{{_ 'activity-sent' cardLink boardLabel}}}.
if($eq activityType 'moveCard')
| {{{_ 'activity-moved' cardLink oldList.title list.title}}}.
if($eq activityType 'addAttachment')
| {{{_ 'activity-attached' attachmentLink cardLink}}}.
if($eq activityType 'addBoardMember')
| {{{_ 'activity-added' memberLink boardLabel}}}.
if($eq activityType 'removeBoardMember')
| {{{_ 'activity-excluded' memberLink boardLabel}}}.
if($eq activityType 'joinMember')
if($eq currentUser._id member._id)
| {{{_ 'activity-joined' cardLink}}}.
else
| {{{_ 'activity-added' memberLink cardLink}}}.
if($eq activityType 'unjoinMember')
if($eq currentUser._id member._id)
| {{{_ 'activity-unjoined' cardLink}}}.
else
| {{{_ 'activity-removed' memberLink cardLink}}}.
if($eq activityType 'addComment')
| {{{_ 'activity-on' cardLink}}}
a.activity-comment(href="{{ card.absoluteUrl }}")
+viewer
= comment.text
if($eq activityType 'addAttachment')
| {{{_ 'activity-attached' attachmentLink cardLink}}}.
if($eq activityType 'addChecklist')
| {{{_ 'activity-checklist-added' cardLink}}}.
.activity-checklist(href="{{ card.absoluteUrl }}")
+viewer
= checklist.title
span.activity-meta {{ moment createdAt }}
if($eq activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' checklist.title cardLink}}}.
.activity-checklist(href="{{ card.absoluteUrl }}")
+viewer
= checklistItem.title
if($eq activityType 'archivedCard')
| {{{_ 'activity-archived' cardLink}}}.
if($eq activityType 'archivedList')
| {{_ 'activity-archived' list.title}}.
if($eq activityType 'archivedSwimlane')
| {{_ 'activity-archived' swimlane.title}}.
if($eq activityType 'createBoard')
| {{_ 'activity-created' boardLabel}}.
if($eq activityType 'createCard')
| {{{_ 'activity-added' cardLink boardLabel}}}.
if($eq activityType 'createList')
| {{_ 'activity-added' list.title boardLabel}}.
if($eq activityType 'createSwimlane')
| {{_ 'activity-added' swimlane.title boardLabel}}.
if($eq activityType 'removeList')
| {{_ 'activity-removed' title boardLabel}}.
if($eq activityType 'importBoard')
| {{{_ 'activity-imported-board' boardLabel sourceLink}}}.
if($eq activityType 'importCard')
| {{{_ 'activity-imported' cardLink boardLabel sourceLink}}}.
if($eq activityType 'importList')
| {{{_ 'activity-imported' listLabel boardLabel sourceLink}}}.
if($eq activityType 'joinMember')
if($eq user._id member._id)
| {{{_ 'activity-joined' cardLink}}}.
else
| {{{_ 'activity-added' memberLink cardLink}}}.
if($eq activityType 'moveCard')
| {{{_ 'activity-moved' cardLink oldList.title list.title}}}.
if($eq activityType 'removeBoardMember')
| {{{_ 'activity-excluded' memberLink boardLabel}}}.
if($eq activityType 'restoredCard')
| {{{_ 'activity-sent' cardLink boardLabel}}}.
if($eq activityType 'unjoinMember')
if($eq user._id member._id)
| {{{_ 'activity-unjoined' cardLink}}}.
else
| {{{_ 'activity-removed' memberLink cardLink}}}.
span(title=createdAt).activity-meta {{ moment createdAt }}
template(name="cardActivities")
each currentCard.activities
@@ -72,13 +102,15 @@ template(name="cardActivities")
+memberName(user=user)
if($eq activityType 'createCard')
| {{_ 'activity-added' cardLabel list.title}}.
if($eq activityType 'importCard')
| {{{_ 'activity-imported' cardLabel list.title sourceLink}}}.
if($eq activityType 'joinMember')
if($eq currentUser._id member._id)
if($eq user._id member._id)
| {{_ 'activity-joined' cardLabel}}.
else
| {{{_ 'activity-added' cardLabel memberLink}}}.
| {{{_ 'activity-added' memberLink cardLabel}}}.
if($eq activityType 'unjoinMember')
if($eq currentUser._id member._id)
if($eq user._id member._id)
| {{_ 'activity-unjoined' cardLabel}}.
else
| {{{_ 'activity-removed' cardLabel memberLink}}}.
@@ -92,6 +124,16 @@ template(name="cardActivities")
| {{{_ 'activity-attached' attachmentLink cardLabel}}}.
if attachment.isImage
img.attachment-image-preview(src=attachment.url)
if($eq activityType 'addChecklist')
| {{{_ 'activity-checklist-added' cardLabel}}}.
.activity-checklist
+viewer
= checklist.title
if($eq activityType 'addChecklistItem')
| {{{_ 'activity-checklist-item-added' checklist.title cardLink}}}.
.activity-checklist(href="{{ card.absoluteUrl }}")
+viewer
= checklistItem.title
if($eq activityType 'addComment')
+inlinedForm(classNames='js-edit-comment')
@@ -103,7 +145,7 @@ template(name="cardActivities")
.activity-comment
+viewer
= comment.text
span.activity-meta {{ moment createdAt }}
span(title=createdAt).activity-meta {{ moment createdAt }}
if ($eq currentUser._id comment.userId)
= ' - '
a.js-open-inlined-form {{_ "edit"}}
@@ -111,4 +153,4 @@ template(name="cardActivities")
a.js-delete-comment {{_ "delete"}}
else
span.activity-meta {{ moment createdAt }}
span(title=createdAt).activity-meta {{ moment createdAt }}
+26 -9
View File
@@ -1,25 +1,23 @@
const activitiesPerPage = 20;
BlazeComponent.extendComponent({
template() {
return 'activities';
},
onCreated() {
// XXX Should we use ReactiveNumber?
this.page = new ReactiveVar(1);
this.loadNextPageLocked = false;
const sidebar = this.componentParent(); // XXX for some reason not working
const sidebar = this.parentComponent(); // XXX for some reason not working
sidebar.callFirstWith(null, 'resetNextPeak');
this.autorun(() => {
const mode = this.data().mode;
const capitalizedMode = Utils.capitalize(mode);
const id = Session.get(`current${capitalizedMode}`);
const limit = this.page.get() * activitiesPerPage;
const user = Meteor.user();
const hideSystem = user ? user.hasHiddenSystemMessages() : false;
if (id === null)
return;
this.subscribe('activities', mode, id, limit, () => {
this.subscribe('activities', mode, id, limit, hideSystem, () => {
this.loadNextPageLocked = false;
// If the sibear peak hasn't increased, that mean that there are no more
@@ -60,6 +58,24 @@ BlazeComponent.extendComponent({
}, card.title));
},
listLabel() {
return this.currentData().list().title;
},
sourceLink() {
const source = this.currentData().source;
if(source) {
if(source.url) {
return Blaze.toHTML(HTML.A({
href: source.url,
}, source.system));
} else {
return source.system;
}
}
return null;
},
memberLink() {
return Blaze.toHTMLWithData(Template.memberName, {
user: this.currentData().member(),
@@ -68,7 +84,8 @@ BlazeComponent.extendComponent({
attachmentLink() {
const attachment = this.currentData().attachment();
return attachment && Blaze.toHTML(HTML.A({
// trying to display url before file is stored generates js errors
return attachment && attachment.url({ download: true }) && Blaze.toHTML(HTML.A({
href: attachment.url({ download: true }),
target: '_blank',
}, attachment.name()));
@@ -83,9 +100,9 @@ BlazeComponent.extendComponent({
},
'submit .js-edit-comment'(evt) {
evt.preventDefault();
const commentText = this.currentComponent().getValue();
const commentText = this.currentComponent().getValue().trim();
const commentId = Template.parentData().commentId;
if ($.trim(commentText)) {
if (commentText) {
CardComments.update(commentId, {
$set: {
text: commentText,
@@ -1,3 +1,10 @@
@import 'nib'
.activity-title
margin: 0 0.5em 0.8em
display: flex
justify-content:space-between
.activities
clear: both
@@ -10,10 +17,14 @@
height: @width
.activity-desc
word-wrap: break-word
overflow: hidden
flex: 1
align-self: center
margin: 0
margin-left: 3px
overflow: hidden;
word-break: break-word;
.activity-comment
display: block
@@ -24,6 +35,14 @@
margin-top: 5px
padding: 5px
.activity-checklist
display: block
border-radius: 3px
background: white
text-decoration: none
box-shadow: 0 1px 2px rgba(0,0,0,.2)
margin-top: 5px
padding: 5px
.activity-meta
font-size: 0.8em
color: darken(white, 40%)
+6 -8
View File
@@ -1,10 +1,6 @@
const commentFormIsOpen = new ReactiveVar(false);
BlazeComponent.extendComponent({
template() {
return 'commentForm';
},
onDestroyed() {
commentFormIsOpen.set(false);
},
@@ -24,11 +20,12 @@ BlazeComponent.extendComponent({
},
'submit .js-new-comment-form'(evt) {
const input = this.getInput();
if ($.trim(input.val())) {
const text = input.val().trim();
if (text) {
CardComments.insert({
text,
boardId: this.currentData().boardId,
cardId: this.currentData()._id,
text: input.val(),
});
resetCommentInput(input);
Tracker.flush();
@@ -72,8 +69,9 @@ EscapeActions.register('inlinedForm',
docId: Session.get('currentCard'),
};
const commentInput = $('.js-new-comment-input');
if ($.trim(commentInput.val())) {
UnsavedEdits.set(draftKey, commentInput.val());
const draft = commentInput.val().trim();
if (draft) {
UnsavedEdits.set(draftKey, draft);
} else {
UnsavedEdits.reset(draftKey);
}
@@ -1,3 +1,5 @@
@import 'nib'
.new-comment
position: relative
margin: 0 0 20px 38px
+3 -3
View File
@@ -1,14 +1,14 @@
template(name="archivedBoards")
h2
i.fa.fa-archive
| Archived boards
| {{_ 'archived-boards'}}
ul.archived-lists
each archivedBoards
li.archived-lists-item
button.js-restore-board
i.fa.fa-undo
| Restore board
| {{_ 'restore-board'}}
= title
else
li.no-items-message No archived board.
li.no-items-message {{_ 'no-archived-boards'}}
+11 -12
View File
@@ -1,14 +1,10 @@
Template.headerTitle.events({
Template.boardListHeaderBar.events({
'click .js-open-archived-board'() {
Modal.open('archivedBoards');
},
});
BlazeComponent.extendComponent({
template() {
return 'archivedBoards';
},
onCreated() {
this.subscribe('archivedBoards');
},
@@ -22,13 +18,16 @@ BlazeComponent.extendComponent({
events() {
return [{
'click .js-restore-board'() {
const boardId = this.currentData()._id;
Boards.update(boardId, {
$set: {
archived: false,
},
});
Utils.goBoardId(boardId);
// TODO : Make isSandstorm variable global
const isSandstorm = Meteor.settings && Meteor.settings.public &&
Meteor.settings.public.sandstorm;
if (isSandstorm && Session.get('currentBoard')) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
currentBoard.archive();
}
const board = this.currentData();
board.restore();
Utils.goBoardId(board._id);
},
}];
},
+10 -23
View File
@@ -1,7 +1,10 @@
template(name="board")
if isBoardReady.get
if currentBoard
+boardBody
if onlyShowCurrentCard
+cardDetails(currentCard)
else
+boardBody
else
//- XXX We need a better error message in case the board has been archived
+message(label="board-not-found")
@@ -11,30 +14,14 @@ template(name="board")
template(name="boardBody")
.board-wrapper(class=currentBoard.colorClass)
+sidebar
.board-canvas(
.board-canvas.js-swimlanes.js-perfect-scrollbar(
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
.lists.js-lists
each currentBoard.lists
+list(this)
if currentCardIsInThisList
+cardDetails(currentCard)
if currentUser.isBoardMember
+addListForm
template(name="addListForm")
.list.js-list.list-composer.js-list-composer
.list-header
+inlinedForm(autoclose=false)
input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
autocomplete="off" autofocus)
.edit-controls.clearfix
button.primary.confirm(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-close-inlined-form
else
a.open-list-composer.js-open-inlined-form
i.fa.fa-plus
| {{_ 'add-list'}}
if isViewSwimlanes
each currentBoard.swimlanes
+swimlane(this)
if isViewLists
+listsGroup
+91 -151
View File
@@ -1,13 +1,8 @@
const subManager = new SubsManager();
const { calculateIndex } = Utils;
BlazeComponent.extendComponent({
template() {
return 'board';
},
onCreated() {
this.draggingActive = new ReactiveVar(false);
this.showOverlay = new ReactiveVar(false);
this.isBoardReady = new ReactiveVar(false);
// The pattern we use to manually handle data loading is described here:
@@ -25,35 +20,92 @@ BlazeComponent.extendComponent({
});
});
});
},
onlyShowCurrentCard() {
return Utils.isMiniScreen() && Session.get('currentCard');
},
}).register('board');
BlazeComponent.extendComponent({
onCreated() {
this.showOverlay = new ReactiveVar(false);
this.draggingActive = new ReactiveVar(false);
this._isDragging = false;
this._lastDragPositionX = 0;
// Used to set the overlay
this.mouseHasEnterCardDetails = false;
},
onRendered() {
const boardComponent = this;
const $swimlanesDom = boardComponent.$('.js-swimlanes');
$swimlanesDom.sortable({
tolerance: 'pointer',
appendTo: '.board-canvas',
helper: 'clone',
handle: '.js-swimlane-header',
items: '.js-swimlane:not(.placeholder)',
placeholder: 'swimlane placeholder',
distance: 7,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
EscapeActions.executeUpTo('popup-close');
boardComponent.setIsDragging(true);
},
stop(evt, ui) {
// To attribute the new index number, we need to get the DOM element
// of the previous and the following card -- if any.
const prevSwimlaneDom = ui.item.prev('.js-swimlane').get(0);
const nextSwimlaneDom = ui.item.next('.js-swimlane').get(0);
const sortIndex = calculateIndex(prevSwimlaneDom, nextSwimlaneDom, 1);
$swimlanesDom.sortable('cancel');
const swimlaneDomElement = ui.item.get(0);
const swimlane = Blaze.getData(swimlaneDomElement);
Swimlanes.update(swimlane._id, {
$set: {
sort: sortIndex.base,
},
});
boardComponent.setIsDragging(false);
},
});
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
}
// If there is no data in the board (ie, no lists) we autofocus the list
// creation form by clicking on the corresponding element.
const currentBoard = Boards.findOne(Session.get('currentBoard'));
if (userIsMember() && currentBoard.lists().count() === 0) {
boardComponent.openNewListForm();
}
},
isViewSwimlanes() {
const currentBoardId = Session.get('currentBoard');
const board = Boards.findOne(currentBoardId);
return (board.view === 'board-view-swimlanes');
},
isViewLists() {
const currentBoardId = Session.get('currentBoard');
const board = Boards.findOne(currentBoardId);
return (board.view === 'board-view-lists');
},
openNewListForm() {
this.componentChildren('addListForm')[0].open();
},
// XXX Flow components allow us to avoid creating these two setter methods by
// exposing a public API to modify the component state. We need to investigate
// best practices here.
setIsDragging(bool) {
this.draggingActive.set(bool);
},
scrollLeft(position = 0) {
this.$('.js-lists').animate({
scrollLeft: position,
});
},
currentCardIsInThisList() {
const currentCard = Cards.findOne(Session.get('currentCard'));
const listId = this.currentData()._id;
return currentCard && currentCard.listId === listId;
if (this.isViewSwimlanes()) {
this.childComponents('swimlane')[0]
.childComponents('addListAndSwimlaneForm')[0].open();
} else if (this.isViewLists()) {
this.childComponents('listsGroup')[0]
.childComponents('addListForm')[0].open();
}
},
events() {
@@ -65,138 +117,26 @@ BlazeComponent.extendComponent({
this.showOverlay.set(false);
}
},
// Click-and-drag action
'mousedown .board-canvas'(evt) {
// Translating the board canvas using the click-and-drag action can
// conflict with the build-in browser mechanism to select text. We
// define a list of elements in which we disable the dragging because
// the user will legitimately expect to be able to select some text with
// his mouse.
const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header'];
if ($(evt.target).closest(noDragInside.join(',')).length === 0) {
this._isDragging = true;
this._lastDragPositionX = evt.clientX;
}
},
'mouseup'() {
if (this._isDragging) {
this._isDragging = false;
}
},
'mousemove'(evt) {
if (this._isDragging) {
// Update the canvas position
this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX;
this._lastDragPositionX = evt.clientX;
// Disable browser text selection while dragging
evt.stopPropagation();
evt.preventDefault();
// Don't close opened card or inlined form at the end of the
// click-and-drag.
EscapeActions.executeUpTo('popup-close');
EscapeActions.preventNextClick();
}
},
}];
},
}).register('board');
Template.boardBody.onRendered(function() {
const self = BlazeComponent.getComponentForElement(this.firstNode);
self.listsDom = this.find('.js-lists');
if (!Session.get('currentCard')) {
self.scrollLeft();
}
// We want to animate the card details window closing. We rely on CSS
// transition for the actual animation.
self.listsDom._uihooks = {
removeElement(node) {
const removeNode = _.once(() => {
node.parentNode.removeChild(node);
});
if ($(node).hasClass('js-card-details')) {
$(node).css({
flexBasis: 0,
padding: 0,
});
$(self.listsDom).one(CSSEvents.transitionend, removeNode);
} else {
removeNode();
}
},
};
if (!Meteor.user() || !Meteor.user().isBoardMember())
return;
self.$(self.listsDom).sortable({
tolerance: 'pointer',
helper: 'clone',
handle: '.js-list-header',
items: '.js-list:not(.js-list-composer)',
placeholder: 'list placeholder',
distance: 7,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
Popup.close();
},
stop() {
self.$('.js-lists').find('.js-list:not(.js-list-composer)').each(
(i, list) => {
const data = Blaze.getData(list);
Lists.update(data._id, {
$set: {
sort: i,
},
});
}
);
},
});
// Disable drag-dropping while in multi-selection mode
self.autorun(() => {
self.$(self.listsDom).sortable('option', 'disabled',
MultiSelection.isActive());
});
// If there is no data in the board (ie, no lists) we autofocus the list
// creation form by clicking on the corresponding element.
const currentBoard = Boards.findOne(Session.get('currentBoard'));
if (currentBoard.lists().count() === 0) {
self.openNewListForm();
}
});
BlazeComponent.extendComponent({
template() {
return 'addListForm';
// XXX Flow components allow us to avoid creating these two setter methods by
// exposing a public API to modify the component state. We need to investigate
// best practices here.
setIsDragging(bool) {
this.draggingActive.set(bool);
},
// Proxy
open() {
this.componentChildren('inlinedForm')[0].open();
scrollLeft(position = 0) {
const swimlanes = this.$('.js-swimlanes');
swimlanes && swimlanes.animate({
scrollLeft: position,
});
},
events() {
return [{
submit(evt) {
evt.preventDefault();
const title = this.find('.list-name-input');
if ($.trim(title.value)) {
Lists.insert({
title: title.value,
boardId: Session.get('currentBoard'),
sort: $('.list').length,
});
title.value = '';
}
},
}];
},
}).register('addListForm');
}).register('boardBody');
+22 -13
View File
@@ -1,8 +1,11 @@
@import 'nib'
position()
if arguments[0] == cover
position: absolute
if arguments[0] == cover || arguments[0] == fixed-cover
if arguments[0] == cover
position: absolute
else
position: fixed
left: 0
right: 0
top: 0
@@ -12,26 +15,18 @@ position()
.board-wrapper
position: cover
overflow-y: hidden;
.board-canvas
position: cover
transition: margin .1s
overflow-y: auto;
&.is-sibling-sidebar-open
margin-right: 248px
.lists
align-items: flex-start
display: flex
flex-direction: row
margin: 0 0 10px
padding: 0 40px 5px 0
overflow-x: auto
overflow-y: hidden
position: cover
.board-overlay
position: cover
position: fixed-cover
top: -100px
right: -400px
background: black
@@ -43,3 +38,17 @@ position()
.open-minicard-composer,
.minicard-wrapper.is-checked
display: none
@media screen and (max-width: 800px)
.board-wrapper
.board-canvas
.swimlane
border-bottom: 1px solid #CCC
display: flex
flex-direction: column
margin: 0
padding: 0 40px 0px 0
overflow-x: hidden
overflow-y: auto
+24 -1
View File
@@ -23,9 +23,13 @@ setBoardColor(color)
.sidebar-list li a:hover
background-color: lighten(color, 10%)
&#header #header-quick-access ul li.current
&#header ul li.current, &#header-quick-access ul li.current
border-bottom: 2px solid lighten(color, 10%)
&#header-quick-access
background: darken(color, 10%)
color: white
&#header #header-main-bar .board-header-btn.emphasis
background: complement(color)
@@ -47,6 +51,25 @@ setBoardColor(color)
&:not(.is-checked) + .minicard:hover:not(.minicard-composer)
background: lighten(color, 97%)
.toggle-label
&:after
background-color: darken(color, 20%)
.toggle-switch:checked ~ .toggle-label
background-color: lighten(color, 20%)
&:after
background-color: darken(color, 20%)
@media screen and (max-width: 800px)
&.pop-over .header
background: color
color: white
&#header ul li.current, &#header-quick-access ul li.current
border-bottom: 4px solid lighten(color, 20%)
.board-color-nephritis
setBoardColor(#27AE60)
+168 -33
View File
@@ -1,45 +1,114 @@
template(name="headerBoard")
template(name="boardHeaderBar")
h1.header-board-menu
with currentBoard
a(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}")
= title
.board-header-btns.left
unless isSandstorm
if currentUser
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
if showStarCounter
span {{_ 'board-nb-stars' currentBoard.stars}}
unless isMiniScreen
unless isSandstorm
if currentBoard
if currentUser
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
if showStarCounter
span
= currentBoard.stars
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}")
i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
span {{_ currentBoard.permission}}
a.board-header-btn(
class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}"
title="{{_ currentBoard.permission}}")
i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
span {{_ currentBoard.permission}}
a.board-header-btn.js-watch-board(
title="{{_ watchLevel }}")
if $eq watchLevel "watching"
i.fa.fa-eye
if $eq watchLevel "tracking"
i.fa.fa-bell
if $eq watchLevel "muted"
i.fa.fa-bell-slash
span {{_ watchLevel}}
else
a.board-header-btn.js-log-in(
title="{{_ 'log-in'}}")
i.fa.fa-sign-in
span {{_ 'log-in'}}
.board-header-btns.right
a.board-header-btn.js-open-filter-view(
title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{/if}}"
class="{{#if Filter.isActive}}emphasis{{/if}}")
i.fa.fa-filter
span {{#if Filter.isActive}}{{_ 'filter-on'}}{{else}}{{_ 'filter'}}{{/if}}
if Filter.isActive
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
if currentBoard
if isMiniScreen
unless isSandstorm
if currentUser
a.board-header-btn.js-star-board(class="{{#if isStarred}}is-active{{/if}}"
title="{{#if isStarred}}{{_ 'click-to-unstar'}}{{else}}{{_ 'click-to-star'}}{{/if}} {{_ 'starred-boards-description'}}")
i.fa(class="fa-star{{#unless isStarred}}-o{{/unless}}")
if showStarCounter
span
= currentBoard.stars
if currentUser.isBoardMember
a.board-header-btn.js-multiselection-activate(
title="{{#if MultiSelection.isActive}}{{_ 'filter-on-desc'}}{{/if}}"
class="{{#if MultiSelection.isActive}}emphasis{{/if}}")
i.fa.fa-check-square-o
span Multi-Selection {{#if MultiSelection.isActive}}is on{{/if}}
if MultiSelection.isActive
a.board-header-btn-close.js-multiselection-reset(title="{{_ 'filter-clear'}}")
a.board-header-btn(
class="{{#if currentUser.isBoardAdmin}}js-change-visibility{{else}}is-disabled{{/if}}"
title="{{_ currentBoard.permission}}")
i.fa(class="{{#if currentBoard.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
span {{_ currentBoard.permission}}
a.board-header-btn.js-watch-board(
title="{{_ watchLevel }}")
if $eq watchLevel "watching"
i.fa.fa-eye
if $eq watchLevel "tracking"
i.fa.fa-bell
if $eq watchLevel "muted"
i.fa.fa-bell-slash
span {{_ watchLevel}}
else
a.board-header-btn.js-log-in(
title="{{_ 'log-in'}}")
i.fa.fa-sign-in
span {{_ 'log-in'}}
if isSandstorm
if currentUser
a.board-header-btn.js-open-archived-board
i.fa.fa-archive
span {{_ 'archives'}}
a.board-header-btn.js-open-filter-view(
title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
class="{{#if Filter.isActive}}emphasis{{/if}}")
i.fa.fa-filter
span {{#if Filter.isActive}}{{_ 'filter-on'}}{{else}}{{_ 'filter'}}{{/if}}
if Filter.isActive
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
.separator
a.board-header-btn.js-open-board-menu
i.board-header-btn-icon.fa.fa-cog
a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
i.fa.fa-search
span {{_ 'search'}}
a.board-header-btn.js-toggle-board-view(
title="{{_ 'board-view'}}")
i.fa.fa-th-large
span {{_ currentBoard.view}}
if canModifyBoard
a.board-header-btn.js-multiselection-activate(
title="{{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}"
class="{{#if MultiSelection.isActive}}emphasis{{/if}}")
i.fa.fa-check-square-o
span {{#if MultiSelection.isActive}}{{_ 'multi-selection-on'}}{{else}}{{_ 'multi-selection'}}{{/if}}
if MultiSelection.isActive
a.board-header-btn-close.js-multiselection-reset(title="{{_ 'filter-clear'}}")
i.fa.fa-times-thin
.separator
a.board-header-btn.js-open-board-menu(title="{{_ 'boardMenuPopup-title'}}")
i.board-header-btn-icon.fa.fa-navicon
template(name="boardMenuPopup")
ul.pop-over-list
@@ -56,7 +125,14 @@ template(name="boardMenuPopup")
if currentUser.isBoardAdmin
hr
ul.pop-over-list
li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}}
li: a.js-archive-board {{_ 'archive-board'}}
li: a.js-outgoing-webhooks {{_ 'outgoing-webhooks'}}
if isSandstorm
hr
ul.pop-over-list
li: a(href="{{exportUrl}}", download="{{exportFilename}}") {{_ 'export-board'}}
li: a.js-import-board {{_ 'import-board-c'}}
template(name="boardVisibilityList")
ul.pop-over-list
@@ -80,6 +156,33 @@ template(name="boardVisibilityList")
template(name="boardChangeVisibilityPopup")
+boardVisibilityList
template(name="boardChangeWatchPopup")
ul.pop-over-list
li
with "watching"
a.js-select-watch
i.fa.fa-eye.colorful
| {{_ 'watching'}}
if watchCheck
i.fa.fa-check
span.sub-name {{_ 'watching-info'}}
li
with "tracking"
a.js-select-watch
i.fa.fa-bell.colorful
| {{_ 'tracking'}}
if watchCheck
i.fa.fa-check
span.sub-name {{_ 'tracking-info'}}
li
with "muted"
a.js-select-watch
i.fa.fa-bell-slash.colorful
| {{_ 'muted'}}
if watchCheck
i.fa.fa-check
span.sub-name {{_ 'muted-info'}}
template(name="boardChangeColorPopup")
.board-backgrounds-list.clearfix
each backgroundColors
@@ -88,7 +191,7 @@ template(name="boardChangeColorPopup")
if isSelected
i.fa.fa-check
template(name="createBoardPopup")
template(name="createBoard")
form
label
| {{_ 'title'}}
@@ -105,17 +208,49 @@ template(name="createBoardPopup")
span.fa.fa-lock.colorful
= " "
| {{{_ 'board-private-info'}}}
a.js-change-visibility Change.
a.js-change-visibility {{_ 'change'}}.
input.primary.wide(type="submit" value="{{_ 'create'}}")
span.quiet
| {{_ 'or'}}
a.js-import-board {{_ 'import-board'}}
template(name="chooseBoardSource")
ul.pop-over-list
li
a(href="{{pathFor '/import/trello'}}") {{_ 'from-trello'}}
li
a(href="{{pathFor '/import/wekan'}}") {{_ 'from-wekan'}}
template(name="boardChangeTitlePopup")
form
label
| {{_ 'title'}}
input.js-board-name(type="text" value=title autofocus)
label
| {{_ 'description'}}
textarea.js-board-desc= description
input.primary.wide(type="submit" value="{{_ 'rename'}}")
template(name="archiveBoardPopup")
p {{_ 'close-board-pop'}}
button.js-confirm.negate.full(type="submit") {{_ 'close'}}
button.js-confirm.negate.full(type="submit") {{_ 'archive'}}
template(name="outgoingWebhooksPopup")
each integrations
form.integration-form
if title
h4 {{title}}
else
h4 {{_ 'no-name'}}
label
| URL
input.js-outgoing-webhooks-url(type="text" name="url" value=url)
input(type="hidden" value=_id name="id")
input.primary.wide(type="submit" value="{{_ 'save'}}")
form.integration-form
h4
| {{_ 'new-outgoing-webhook'}}
label
| URL
input.js-outgoing-webhooks-url(type="text" name="url" autofocus)
input.primary.wide(type="submit" value="{{_ 'save'}}")
+160 -36
View File
@@ -6,24 +6,40 @@ Template.boardMenuPopup.events({
},
'click .js-change-board-color': Popup.open('boardChangeColor'),
'click .js-change-language': Popup.open('changeLanguage'),
'click .js-archive-board ': Popup.afterConfirm('archiveBoard', () => {
const boardId = Session.get('currentBoard');
Boards.update(boardId, { $set: { archived: true }});
'click .js-archive-board ': Popup.afterConfirm('archiveBoard', function() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
currentBoard.archive();
// XXX We should have some kind of notification on top of the page to
// confirm that the board was successfully archived.
FlowRouter.go('home');
}),
'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'),
'click .js-import-board': Popup.open('chooseBoardSource'),
});
Template.boardMenuPopup.helpers({
exportUrl() {
const params = {
boardId: Session.get('currentBoard'),
};
const queryParams = {
authToken: Accounts._storedLoginToken(),
};
return FlowRouter.path('/api/boards/:boardId/export', params, queryParams);
},
exportFilename() {
const boardId = Session.get('currentBoard');
return `wekan-export-board-${boardId}.json`;
},
});
Template.boardChangeTitlePopup.events({
submit(evt, tpl) {
const title = tpl.$('.js-board-name').val().trim();
if (title) {
Boards.update(this._id, {
$set: {
title,
},
});
const newTitle = tpl.$('.js-board-name').val().trim();
const newDesc = tpl.$('.js-board-desc').val().trim();
if (newTitle) {
this.rename(newTitle);
this.setDescription(newDesc);
Popup.close();
}
evt.preventDefault();
@@ -31,8 +47,9 @@ Template.boardChangeTitlePopup.events({
});
BlazeComponent.extendComponent({
template() {
return 'headerBoard';
watchLevel() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return currentBoard && currentBoard.getWatchLevel(Meteor.userId());
},
isStarred() {
@@ -55,6 +72,26 @@ BlazeComponent.extendComponent({
},
'click .js-open-board-menu': Popup.open('boardMenu'),
'click .js-change-visibility': Popup.open('boardChangeVisibility'),
'click .js-watch-board': Popup.open('boardChangeWatch'),
'click .js-open-archived-board'() {
Modal.open('archivedBoards');
},
'click .js-toggle-board-view'() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
if (currentBoard.view === 'board-view-swimlanes') {
Boards.update(currentBoard._id, {
$set: {
view: 'board-view-lists',
},
});
} else if (currentBoard.view === 'board-view-lists') {
Boards.update(currentBoard._id, {
$set: {
view: 'board-view-swimlanes',
},
});
}
},
'click .js-open-filter-view'() {
Sidebar.setView('filter');
},
@@ -63,6 +100,9 @@ BlazeComponent.extendComponent({
Sidebar.setView();
Filter.reset();
},
'click .js-open-search-view'() {
Sidebar.setView('search');
},
'click .js-multiselection-activate'() {
const currentCard = Session.get('currentCard');
MultiSelection.activate();
@@ -74,15 +114,20 @@ BlazeComponent.extendComponent({
evt.stopPropagation();
MultiSelection.disable();
},
'click .js-log-in'() {
FlowRouter.go('atSignIn');
},
}];
},
}).register('headerBoard');
}).register('boardHeaderBar');
Template.boardHeaderBar.helpers({
canModifyBoard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
});
BlazeComponent.extendComponent({
template() {
return 'boardChangeColorPopup';
},
backgroundColors() {
return Boards.simpleSchema()._schema.color.allowedValues;
},
@@ -95,26 +140,24 @@ BlazeComponent.extendComponent({
events() {
return [{
'click .js-select-background'(evt) {
const currentBoardId = Session.get('currentBoard');
Boards.update(currentBoardId, {
$set: {
color: this.currentData().toString(),
},
});
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const newColor = this.currentData().toString();
currentBoard.setColor(newColor);
evt.preventDefault();
},
}];
},
}).register('boardChangeColorPopup');
BlazeComponent.extendComponent({
const CreateBoard = BlazeComponent.extendComponent({
template() {
return 'createBoardPopup';
return 'createBoard';
},
onCreated() {
this.visibilityMenuIsOpen = new ReactiveVar(false);
this.visibility = new ReactiveVar('private');
this.boardId = new ReactiveVar('');
},
visibilityCheck() {
@@ -135,15 +178,17 @@ BlazeComponent.extendComponent({
const title = this.find('.js-new-board-title').value;
const visibility = this.visibility.get();
const boardId = Boards.insert({
this.boardId.set(Boards.insert({
title,
permission: visibility,
}));
Swimlanes.insert({
title: 'Default',
boardId: this.boardId.get(),
});
Utils.goBoardId(boardId);
// Immediately star boards crated with the headerbar popup.
Meteor.user().toggleBoardStar(boardId);
Utils.goBoardId(this.boardId.get());
},
events() {
@@ -152,27 +197,37 @@ BlazeComponent.extendComponent({
this.setVisibility(this.currentData());
},
'click .js-change-visibility': this.toggleVisibilityMenu,
'click .js-import': Popup.open('boardImportBoard'),
submit: this.onSubmit,
'click .js-import-board': Popup.open('chooseBoardSource'),
}];
},
}).register('createBoardPopup');
BlazeComponent.extendComponent({
template() {
return 'boardChangeVisibilityPopup';
return 'chooseBoardSource';
},
}).register('chooseBoardSourcePopup');
(class HeaderBarCreateBoard extends CreateBoard {
onSubmit(evt) {
super.onSubmit(evt);
// Immediately star boards crated with the headerbar popup.
Meteor.user().toggleBoardStar(this.boardId.get());
}
}).register('headerBarCreateBoardPopup');
BlazeComponent.extendComponent({
visibilityCheck() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return this.currentData() === currentBoard.permission;
},
selectBoardVisibility() {
Boards.update(Session.get('currentBoard'), {
$set: {
permission: this.currentData(),
},
});
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const visibility = this.currentData();
currentBoard.setVisibility(visibility);
Popup.close();
},
@@ -182,3 +237,72 @@ BlazeComponent.extendComponent({
}];
},
}).register('boardChangeVisibilityPopup');
BlazeComponent.extendComponent({
watchLevel() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return currentBoard.getWatchLevel(Meteor.userId());
},
watchCheck() {
return this.currentData() === this.watchLevel();
},
events() {
return [{
'click .js-select-watch'() {
const level = this.currentData();
Meteor.call('watch', 'board', Session.get('currentBoard'), level, (err, ret) => {
if (!err && ret) Popup.close();
});
},
}];
},
}).register('boardChangeWatchPopup');
BlazeComponent.extendComponent({
integrations() {
const boardId = Session.get('currentBoard');
return Integrations.find({ boardId: `${boardId}` }).fetch();
},
integration(id) {
const boardId = Session.get('currentBoard');
return Integrations.findOne({ _id: id, boardId: `${boardId}` });
},
events() {
return [{
'submit'(evt) {
evt.preventDefault();
const url = evt.target.url.value;
const boardId = Session.get('currentBoard');
let id = null;
let integration = null;
if (evt.target.id) {
id = evt.target.id.value;
integration = this.integration(id);
if (url) {
Integrations.update(integration._id, {
$set: {
url: `${url}`,
},
});
} else {
Integrations.remove(integration._id);
}
} else if (url) {
Integrations.insert({
userId: Meteor.userId(),
enabled: true,
type: 'outgoing-webhooks',
url: `${url}`,
boardId: `${boardId}`,
activities: ['all'],
});
}
Popup.close();
},
}];
},
}).register('outgoingWebhooksPopup');
@@ -0,0 +1,3 @@
.integration-form
padding: 5px
border-bottom: 1px solid #ccc
+33 -7
View File
@@ -3,11 +3,37 @@ template(name="boardList")
ul.board-list.clearfix
each boards
li(class="{{#if isStarred}}starred{{/if}}" class=colorClass)
a.js-open-board(href="{{pathFor 'board' id=_id slug=slug}}")
span.details
span.board-list-item-name= title
i.fa.js-star-board(
class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}"
title="{{_ 'star-board-title'}}")
if isInvited
.board-list-item
span.details
span.board-list-item-name= title
i.fa.js-star-board(
class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}"
title="{{_ 'star-board-title'}}")
p.board-list-item-desc {{_ 'just-invited'}}
button.js-accept-invite.primary {{_ 'accept'}}
button.js-decline-invite {{_ 'decline'}}
else
a.js-open-board.board-list-item(href="{{pathFor 'board' id=_id slug=slug}}")
span.details
span.board-list-item-name= title
i.fa.js-star-board(
class="fa-star{{#if isStarred}} is-star-active{{else}}-o{{/if}}"
title="{{_ 'star-board-title'}}")
if hasSpentTimeCards
i.fa.js-has-spenttime-cards(
class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}"
title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}")
p.board-list-item-desc= description
li.js-add-board
a.label {{_ 'add-board'}}
a.board-list-item.label {{_ 'add-board'}}
template(name="boardListHeaderBar")
h1 {{_ 'my-boards'}}
.board-header-btns.right
a.board-header-btn.js-open-archived-board
i.fa.fa-archive
span {{_ 'archives'}}
+32 -2
View File
@@ -1,6 +1,8 @@
const subManager = new SubsManager();
BlazeComponent.extendComponent({
template() {
return 'boardList';
onCreated() {
Meteor.subscribe('setting');
},
boards() {
@@ -17,6 +19,21 @@ BlazeComponent.extendComponent({
return user && user.hasStarred(this.currentData()._id);
},
hasOvertimeCards() {
subManager.subscribe('board', this.currentData()._id);
return this.currentData().hasOvertimeCards();
},
hasSpentTimeCards() {
subManager.subscribe('board', this.currentData()._id);
return this.currentData().hasSpentTimeCards();
},
isInvited() {
const user = Meteor.user();
return user && user.isInvitedTo(this.currentData()._id);
},
events() {
return [{
'click .js-add-board': Popup.open('createBoard'),
@@ -25,6 +42,19 @@ BlazeComponent.extendComponent({
Meteor.user().toggleBoardStar(boardId);
evt.preventDefault();
},
'click .js-accept-invite'() {
const boardId = this.currentData()._id;
Meteor.user().removeInvite(boardId);
},
'click .js-decline-invite'() {
const boardId = this.currentData()._id;
Meteor.call('quitBoard', boardId, (err, ret) => {
if (!err && ret) {
Meteor.user().removeInvite(boardId);
FlowRouter.go('home');
}
});
},
}];
},
}).register('boardList');
+50 -4
View File
@@ -1,7 +1,9 @@
@import 'nib'
$spaceBetweenTiles = 16px
.board-list
margin: $spaceBetweenTiles ($spaceBetweenTiles/-2) 0
margin: 0 ($spaceBetweenTiles/2)
li
float: left
@@ -14,7 +16,8 @@ $spaceBetweenTiles = 16px
.fa-star-o
opacity: 1
a
.board-list-item
overflow: hidden;
background-color: #999
color: #f6f6f6
height: 90px
@@ -24,8 +27,8 @@ $spaceBetweenTiles = 16px
display: block
font-weight: 700
min-height: 18px
padding: 8px 12px 8px 12px
margin: 0 ($spaceBetweenTiles/2) $spaceBetweenTiles
padding: 8px
margin: ($spaceBetweenTiles/2)
position: relative
text-decoration: none
@@ -40,6 +43,13 @@ $spaceBetweenTiles = 16px
font-weight: 400
line-height: 22px
.board-list-item-desc
color: rgba(255, 255, 255, .5)
display: block
font-size: 10px
font-weight: 400
line-height: 18px
.js-add-board
text-align:center
@@ -64,6 +74,23 @@ $spaceBetweenTiles = 16px
transition-duration: .15s
transition-property: color, font-size, background
.fa-circle
bottom: 0;
font-size: 10px;
height: 10px;
line-height: 10px;
padding: 9px 9px;
position: absolute;
right: 0;
transition-duration: .15s
transition-property: color, font-size, background
.has-overtime-card-active
color: #eb4646 !important
.no-overtime-card-active
color: #3cb500 !important
.is-star-active
color: white
@@ -121,3 +148,22 @@ $spaceBetweenTiles = 16px
font-size: 25px
color: white
@media screen and (max-width: 800px)
.board-list
height: 100%
overflow: scroll
li
width: 33.3%
.board-list-item
overflow: hidden
.board-list-item-sub-name
position: relative
top: -100px
left: -100px
@media screen and (max-width: 360px)
li
width: 50%
+15 -4
View File
@@ -3,6 +3,16 @@ template(name="cardAttachmentsPopup")
li
input.js-attach-file.hide(type="file" name="file" multiple)
a.js-computer-upload {{_ 'computer'}}
li
a.js-upload-clipboard-image {{_ 'clipboard'}}
template(name="previewClipboardImagePopup")
p <kbd>Ctrl</kbd>+<kbd>V</kbd> {{_ "paste-or-dragdrop"}}
img.preview-clipboard-image()
button.primary.js-upload-pasted-image {{_ 'upload'}}
template(name="previewAttachedImagePopup")
img.preview-large-image.js-large-image-clicked(src="{{url}}")
template(name="attachmentDeletePopup")
p {{_ "attachment-delete-pop"}}
@@ -11,11 +21,11 @@ template(name="attachmentDeletePopup")
template(name="attachmentsGalery")
.attachments-galery
each attachments
a.attachment-item.js-open-viewer(title="{{_ 'added'}} {{ moment uploadedAt }}")
.attachment-thumbnail
.attachment-item
a.attachment-thumbnail.swipebox(href="{{url}}" title="{{name}}")
if isUploaded
if isImage
img.attachment-thumbnail-img(src=url)
img.attachment-thumbnail-img(src="{{url}}")
else
span.attachment-thumbnail-ext= extension
else
@@ -39,4 +49,5 @@ template(name="attachmentsGalery")
| {{_ 'delete'}}
if currentUser.isBoardMember
a.attachment-item.add-attachment.js-add-attachment {{_ 'add-attachment' }}
li.attachment-item.add-attachment
a.js-add-attachment {{_ 'add-attachment' }}
+94 -8
View File
@@ -1,7 +1,7 @@
Template.attachmentsGalery.events({
'click .js-add-attachment': Popup.open('cardAttachments'),
'click .js-confirm-delete': Popup.afterConfirm('attachmentDelete',
() => {
function() {
Attachments.remove(this._id);
Popup.close();
}
@@ -11,14 +11,44 @@ Template.attachmentsGalery.events({
'click .js-download'(event) {
event.stopPropagation();
},
'click .js-open-viewer'() {
// XXX Not implemented!
},
'click .js-add-cover'() {
Cards.update(this.cardId, { $set: { coverId: this._id } });
Cards.findOne(this.cardId).setCover(this._id);
},
'click .js-remove-cover'() {
Cards.update(this.cardId, { $unset: { coverId: '' } });
Cards.findOne(this.cardId).unsetCover();
},
'click .js-preview-image'(evt) {
Popup.open('previewAttachedImage').call(this, evt);
// when multiple thumbnails, if click one then another very fast,
// we might get a wrong width from previous img.
// when popup reused, onRendered() won't be called, so we cannot get there.
// here make sure to get correct size when this img fully loaded.
const img = $('img.preview-large-image')[0];
if (!img) return;
const rePosPopup = () => {
const w = img.width;
const h = img.height;
// if the image is too large, we resize & center the popup.
if (w > 300) {
$('div.pop-over').css({
width: (w + 20),
position: 'absolute',
left: (window.innerWidth - w)/2,
top: (window.innerHeight - h)/2,
});
}
};
const url = $(evt.currentTarget).attr('src');
if (img.src === url && img.complete)
rePosPopup();
else
img.onload = rePosPopup;
},
});
Template.previewAttachedImagePopup.events({
'click .js-large-image-clicked'(){
Popup.close();
},
});
@@ -28,9 +58,15 @@ Template.cardAttachmentsPopup.events({
FS.Utility.eachFile(evt, (f) => {
const file = new FS.File(f);
file.boardId = card.boardId;
file.cardId = card._id;
file.cardId = card._id;
file.userId = Meteor.userId();
const attachment = Attachments.insert(file);
if (attachment && attachment._id && attachment.isImage()) {
card.setCover(attachment._id);
}
Attachments.insert(file);
Popup.close();
});
},
@@ -38,4 +74,54 @@ Template.cardAttachmentsPopup.events({
tpl.find('.js-attach-file').click();
evt.preventDefault();
},
'click .js-upload-clipboard-image': Popup.open('previewClipboardImage'),
});
let pastedResults = null;
Template.previewClipboardImagePopup.onRendered(() => {
// we can paste image from clipboard
$(document.body).pasteImageReader((results) => {
if (results.dataURL.startsWith('data:image/')) {
$('img.preview-clipboard-image').attr('src', results.dataURL);
pastedResults = results;
}
});
// we can also drag & drop image file to it
$(document.body).dropImageReader((results) => {
if (results.dataURL.startsWith('data:image/')) {
$('img.preview-clipboard-image').attr('src', results.dataURL);
pastedResults = results;
}
});
});
Template.previewClipboardImagePopup.events({
'click .js-upload-pasted-image'() {
const results = pastedResults;
if (results && results.file) {
const card = this;
const file = new FS.File(results.file);
if (!results.name) {
// if no filename, it's from clipboard. then we give it a name, with ext name from MIME type
if (typeof results.file.type === 'string') {
file.name(results.file.type.replace('image/', 'clipboard.'));
}
}
file.updatedAt(new Date());
file.boardId = card.boardId;
file.cardId = card._id;
file.userId = Meteor.userId();
const attachment = Attachments.insert(file);
if (attachment && attachment._id && attachment.isImage()) {
card.setCover(attachment._id);
}
pastedResults = null;
$(document.body).pasteImageReader(() => {});
Popup.close();
}
},
});
+41 -3
View File
@@ -1,3 +1,5 @@
@import 'nib'
.attachments-galery
display: flex
flex-wrap: wrap
@@ -18,6 +20,10 @@
display: flex
align-items: center
a
display: block
margin: auto
.attachment-thumbnail
height: 80px
display: flex
@@ -26,8 +32,8 @@
position: relative
.attachment-thumbnail-img
height: 100%
width: 100%
max-height: 100%
max-width: 100%
.attachment-thumbnail-ext
text-transform: uppercase
@@ -37,7 +43,7 @@
font-size: 0.75em
margin: 3px
.attachment-details-actions
.attachment-details-actions a
display: block
.attachment-image-preview
@@ -45,3 +51,35 @@
display: block
box-shadow: 0 1px 2px rgba(0,0,0,.2)
.preview-large-image
max-width: 1000px
display: block
box-shadow: 0 1px 2px rgba(0,0,0,.2)
.preview-clipboard-image
width: 280px
max-width: 100%;
height: 200px
display: block
border: 1px solid black
box-shadow: 0 1px 2px rgba(0,0,0,.2)
@media screen and (max-width: 800px)
.attachments-galery
flex-direction
row
.attachment-item
width: 50% - 2%
.attachment-thumbnail
height: 130px
.attachment-details
font-size: 1.1em
@media screen and (max-width: 360px)
.attachments-galery
.attachment-item
width: 100%
.attachment-thumbnail
height: 200px
+26
View File
@@ -0,0 +1,26 @@
template(name="editCardDate")
.edit-card-date
form.edit-date
.fields
.left
label(for="date") {{_ 'date'}}
input.js-date-field#date(type="text" name="date" value=showDate placeholder=dateFormat autofocus)
.right
label(for="time") {{_ 'time'}}
input.js-time-field#time(type="text" name="time" value=showTime placeholder=timeFormat)
.js-datepicker
if error.get
.warning {{_ error.get}}
button.primary.wide.left.js-submit-date(type="submit") {{_ 'save'}}
button.js-delete-date.negate.wide.right.js-delete-date {{_ 'delete'}}
template(name="dateBadge")
if canModifyCard
a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
else
a.card-date(title="{{showTitle}}" class="{{classes}}")
time(datetime="{{showISODate}}")
| {{showDate}}
+236
View File
@@ -0,0 +1,236 @@
// Edit start & due dates
const EditCardDate = BlazeComponent.extendComponent({
template() {
return 'editCardDate';
},
onCreated() {
this.error = new ReactiveVar('');
this.card = this.data();
this.date = new ReactiveVar(moment.invalid());
},
onRendered() {
const $picker = this.$('.js-datepicker').datepicker({
todayHighlight: true,
todayBtn: 'linked',
language: TAPi18n.getLanguage(),
}).on('changeDate', function(evt) {
this.find('#date').value = moment(evt.date).format('L');
this.error.set('');
this.find('#time').focus();
}.bind(this));
if (this.date.get().isValid()) {
$picker.datepicker('update', this.date.get().toDate());
}
},
showDate() {
if (this.date.get().isValid())
return this.date.get().format('L');
return '';
},
showTime() {
if (this.date.get().isValid())
return this.date.get().format('LT');
return '';
},
dateFormat() {
return moment.localeData().longDateFormat('L');
},
timeFormat() {
return moment.localeData().longDateFormat('LT');
},
events() {
return [{
'keyup .js-date-field'() {
// parse for localized date format in strict mode
const dateMoment = moment(this.find('#date').value, 'L', true);
if (dateMoment.isValid()) {
this.error.set('');
this.$('.js-datepicker').datepicker('update', dateMoment.toDate());
}
},
'keyup .js-time-field'() {
// parse for localized time format in strict mode
const dateMoment = moment(this.find('#time').value, 'LT', true);
if (dateMoment.isValid()) {
this.error.set('');
}
},
'submit .edit-date'(evt) {
evt.preventDefault();
// if no time was given, init with 12:00
const time = evt.target.time.value || moment(new Date().setHours(12, 0, 0)).format('LT');
const dateString = `${evt.target.date.value} ${time}`;
const newDate = moment(dateString, 'L LT', true);
if (newDate.isValid()) {
this._storeDate(newDate.toDate());
Popup.close();
}
else {
this.error.set('invalid-date');
evt.target.date.focus();
}
},
'click .js-delete-date'(evt) {
evt.preventDefault();
this._deleteDate();
Popup.close();
},
}];
},
});
Template.dateBadge.helpers({
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
});
// editCardStartDatePopup
(class extends EditCardDate {
onCreated() {
super.onCreated();
this.data().startAt && this.date.set(moment(this.data().startAt));
}
_storeDate(date) {
this.card.setStart(date);
}
_deleteDate() {
this.card.unsetStart();
}
}).register('editCardStartDatePopup');
// editCardDueDatePopup
(class extends EditCardDate {
onCreated() {
super.onCreated();
this.data().dueAt && this.date.set(moment(this.data().dueAt));
}
onRendered() {
super.onRendered();
if (moment.isDate(this.card.startAt)) {
this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt);
}
}
_storeDate(date) {
this.card.setDue(date);
}
_deleteDate() {
this.card.unsetDue();
}
}).register('editCardDueDatePopup');
// Display start & due dates
const CardDate = BlazeComponent.extendComponent({
template() {
return 'dateBadge';
},
onCreated() {
const self = this;
self.date = ReactiveVar();
self.now = ReactiveVar(moment());
window.setInterval(() => {
self.now.set(moment());
}, 60000);
},
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',
});
},
showISODate() {
return this.date.get().toISOString();
},
});
class CardStartDate extends CardDate {
onCreated() {
super.onCreated();
const self = this;
self.autorun(() => {
self.date.set(moment(self.data().startAt));
});
}
classes() {
let classes = 'start-date' + ' ';
if (this.date.get().isBefore(this.now.get(), 'minute') &&
this.now.get().isBefore(this.data().dueAt)) {
classes += 'current';
}
return classes;
}
showTitle() {
return `${TAPi18n.__('card-start-on')} ${this.date.get().format('LLLL')}`;
}
events() {
return super.events().concat({
'click .js-edit-date': Popup.open('editCardStartDate'),
});
}
}
CardStartDate.register('cardStartDate');
class CardDueDate extends CardDate {
onCreated() {
super.onCreated();
const self = this;
self.autorun(() => {
self.date.set(moment(self.data().dueAt));
});
}
classes() {
let classes = 'due-date' + ' ';
if (this.now.get().diff(this.date.get(), 'days') >= 2)
classes += 'long-overdue';
else if (this.now.get().diff(this.date.get(), 'minute') >= 0)
classes += 'due';
else if (this.now.get().diff(this.date.get(), 'days') >= -1)
classes += 'almost-due';
return classes;
}
showTitle() {
return `${TAPi18n.__('card-due-on')} ${this.date.get().format('LLLL')}`;
}
events() {
return super.events().concat({
'click .js-edit-date': Popup.open('editCardDueDate'),
});
}
}
CardDueDate.register('cardDueDate');
(class extends CardStartDate {
showDate() {
return this.date.get().format('l');
}
}).register('minicardStartDate');
(class extends CardDueDate {
showDate() {
return this.date.get().format('l');
}
}).register('minicardDueDate');
+68
View File
@@ -0,0 +1,68 @@
.edit-card-date
.fields
.left
width: 56%
.right
width: 38%
.datepicker
width: 100%
table
width: 100%
border: none
border-spacing: 0
border-collapse: collapse
thead
background: none
td, th
box-sizing: border-box
.card-date
display: block
border-radius: 4px
padding: 1px 3px
background-color: #dbdbdb
&:hover, &.is-active
background-color: #b3b3b3
&.current, &.almost-due, &.due, &.long-overdue
color: #fff
&.current
background-color: #5ba639
&:hover, &.is-active
background-color: darken(#5ba639, 10)
&.almost-due
background-color: #edc909
&:hover, &.is-active
background-color: darken(#edc909, 10)
&.due
background-color: #fa3f00
&:hover, &.is-active
background-color: darken(#fa3f00, 10)
&.long-overdue
background-color: #fd5d47
&:hover, &.is-active
background-color: darken(#fd5d47, 7)
&.due-date
time
&::before
content: "\f090" // symbol: fa-sign-in
&.start-date
time
&::before
content: "\f08b" // symbol: fa-sign-out
time
&::before
font: normal normal normal 14px/1 FontAwesome
font-size: inherit
-webkit-font-smoothing: antialiased
margin-right: 0.3em
+129 -31
View File
@@ -2,17 +2,17 @@ template(name="cardDetails")
section.card-details.js-card-details.js-perfect-scrollbar: .card-details-canvas
.card-details-header
+inlinedForm(classNames="js-card-details-title")
input.full-line(type="text" value=title autofocus)
.edit-controls.clearfix
button.primary.confirm(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-close-inlined-form
+editCardTitleForm
else
a.fa.fa-times-thin.close-card-details.js-close-card-details
if currentUser.isBoardMember
a.fa.fa-ellipsis-v.card-details-menu.js-open-card-details-menu
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
h2.card-details-title.js-card-title(
class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
= title
class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
+viewer
= title
if isWatching
i.fa.fa-eye.card-details-watch
if archived
p.warning {{_ 'card-archived'}}
@@ -23,21 +23,40 @@ template(name="cardDetails")
each members
+userAvatar(userId=this cardId=../_id)
| {{! XXX Hack to hide syntaxic coloration /// }}
if currentUser.isBoardMember
if canModifyCard
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
i.fa.fa-plus
.card-details-item.card-details-item-labels
h3.card-details-item-title {{_ 'labels'}}
a(class="{{#if currentUser.isBoardMember}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
each labels
span.card-label(class="card-label-{{color}}" title=name)= name
if currentUser.isBoardMember
if canModifyCard
a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}")
i.fa.fa-plus
if startAt
.card-details-item.card-details-item-start
h3.card-details-item-title {{_ 'card-start'}}
+cardStartDate
if dueAt
.card-details-item.card-details-item-due
h3.card-details-item-title {{_ 'card-due'}}
+cardDueDate
.card-details-items
if spentTime
.card-details-item.card-details-item-spent
if isOvertime
h3.card-details-item-title {{_ 'overtime-hours'}}
else
h3.card-details-item-title {{_ 'spent-time-hours'}}
+cardSpentTime
//- XXX We should use "editable" to avoid repetiting ourselves
if currentUser.isBoardMember
if canModifyCard
h3.card-details-item-title {{_ 'description'}}
+inlinedCardDescription(classNames="card-description js-card-description")
+editor(autofocus=true)
@@ -62,39 +81,115 @@ template(name="cardDetails")
h3.card-details-item-title {{_ 'description'}}
+viewer
= description
if attachments.count
hr
h2
i.fa.fa-paperclip
| {{_ 'attachments'}}
+attachmentsGalery
hr
h2 {{ _ 'activity'}}
+checklists(cardId = _id)
hr
h2
i.fa.fa-paperclip
| {{_ 'attachments'}}
+attachmentsGalery
hr
.activity-title
h2 {{ _ 'activity'}}
if currentUser.isBoardMember
.material-toggle-switch
span.toggle-switch-title {{_ 'hide-system-messages'}}
if hiddenSystemMessages
input.toggle-switch(type="checkbox" id="toggleButton" checked="checked")
else
input.toggle-switch(type="checkbox" id="toggleButton")
label.toggle-label(for="toggleButton")
if currentUser.isBoardMember
+commentForm
if isLoaded.get
+activities(card=this mode="card")
template(name="editCardTitleForm")
textarea.js-edit-card-title(rows='1' autofocus)
= title
.edit-controls.clearfix
button.primary.confirm.js-submit-edit-card-title-form(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-close-inlined-form
template(name="cardDetailsActionsPopup")
ul.pop-over-list
li: a.js-members {{_ 'card-edit-members'}}
li: a.js-labels {{_ 'card-edit-labels'}}
li: a.js-attachments {{_ 'card-edit-attachments'}}
hr
ul.pop-over-list
li: a.js-move-card {{_ 'moveCardPopup-title'}}
unless archived
li: a.js-archive {{_ 'archive-card'}}
li: a.js-more {{_ 'cardMorePopup-title'}}
li: a.js-toggle-watch-card {{#if isWatching}}{{_ 'unwatch'}}{{else}}{{_ 'watch'}}{{/if}}
if canModifyCard
hr
ul.pop-over-list
li: a.js-members {{_ 'card-edit-members'}}
li: a.js-labels {{_ 'card-edit-labels'}}
li: a.js-attachments {{_ 'card-edit-attachments'}}
li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
li: a.js-spent-time {{_ 'editCardSpentTimePopup-title'}}
hr
ul.pop-over-list
li: a.js-move-card-to-top {{_ 'moveCardToTop-title'}}
li: a.js-move-card-to-bottom {{_ 'moveCardToBottom-title'}}
hr
ul.pop-over-list
li: a.js-move-card {{_ 'moveCardPopup-title'}}
li: a.js-copy-card {{_ 'copyCardPopup-title'}}
li: a.js-copy-checklist-cards {{_ 'copyChecklistToManyCardsPopup-title'}}
unless archived
li: a.js-archive {{_ 'archive-card'}}
li: a.js-more {{_ 'cardMorePopup-title'}}
template(name="moveCardPopup")
+boardLists
if isSandstorm
+boardLists
else
+boardsAndLists
template(name="copyCardPopup")
label(for='copy-card-title') {{_ 'title'}}:
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
= title
if isSandstorm
+boardLists
else
+boardsAndLists
template(name="copyChecklistToManyCardsPopup")
label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
| {{_ 'copyChecklistToManyCardsPopup-format'}}
if isSandstorm
+boardLists
else
+boardsAndLists
template(name="boardsAndLists")
label {{_ 'boards'}}:
select.js-select-boards
each boards
if $eq _id currentBoard._id
option(value="{{_id}}" selected) {{_ 'current'}}
else
option(value="{{_id}}") {{title}}
label {{_ 'swimlanes'}}:
select.js-select-swimlanes
each swimlanes
option(value="{{_id}}") {{title}}
label {{_ 'lists'}}:
select.js-select-lists
each aBoardLists
option(value="{{_id}}") {{title}}
.edit-controls.clearfix
button.primary.confirm.js-done {{_ 'done'}}
template(name="cardMembersPopup")
ul.pop-over-list.js-card-member-list
each board.members
each board.activeMembers
li.item(class="{{#if isCardMember}}active{{/if}}")
a.name.js-select-member(href="#")
+userAvatar(userId=user._id)
@@ -110,7 +205,10 @@ template(name="cardMorePopup")
span {{_ 'link-card'}}
= ' '
i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
input.inline-input(type="text" readonly value="{{ rootUrl }}")
input.inline-input(type="text" id="cardURL" readonly value="{{ absoluteUrl }}")
button.js-copy-card-link-to-clipboard(class="btn") {{_ 'copy-card-link-to-clipboard'}}
span.clearfix
br
| {{_ 'added'}}
span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
+276 -53
View File
@@ -1,34 +1,51 @@
BlazeComponent.extendComponent({
template() {
return 'cardDetails';
},
const subManager = new SubsManager();
BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
},
calculateNextPeak() {
const altitude = this.find('.js-card-details').scrollHeight;
this.callFirstWith(this, 'setNextPeak', altitude);
const cardElement = this.find('.js-card-details');
if (cardElement) {
const altitude = cardElement.scrollHeight;
this.callFirstWith(this, 'setNextPeak', altitude);
}
},
reachNextPeak() {
const activitiesComponent = this.componentChildren('activities')[0];
const activitiesComponent = this.childComponents('activities')[0];
activitiesComponent.loadNextPage();
},
onCreated() {
this.isLoaded = new ReactiveVar(false);
this.componentParent().showOverlay.set(true);
this.componentParent().mouseHasEnterCardDetails = false;
this.parentComponent().parentComponent().showOverlay.set(true);
this.parentComponent().parentComponent().mouseHasEnterCardDetails = false;
this.calculateNextPeak();
Meteor.subscribe('unsaved-edits');
},
isWatching() {
const card = this.currentData();
return card.findWatcher(Meteor.userId());
},
hiddenSystemMessages() {
return Meteor.user().hasHiddenSystemMessages();
},
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
scrollParentContainer() {
const cardPanelWidth = 510;
const bodyBoardComponent = this.componentParent();
const bodyBoardComponent = this.parentComponent().parentComponent();
const $cardContainer = bodyBoardComponent.$('.js-lists');
const $cardView = this.$(this.firstNode());
const $cardContainer = bodyBoardComponent.$('.js-swimlanes');
const cardContainerScroll = $cardContainer.scrollLeft();
const cardContainerWidth = $cardContainer.width();
@@ -38,7 +55,7 @@ BlazeComponent.extendComponent({
let offset = false;
if (cardViewStart < 0) {
offset = cardViewStart;
} else if(cardViewEnd > cardContainerWidth) {
} else if (cardViewEnd > cardContainerWidth) {
offset = cardViewEnd - cardContainerWidth;
}
@@ -48,51 +65,52 @@ BlazeComponent.extendComponent({
},
onRendered() {
this.scrollParentContainer();
if (!Utils.isMiniScreen()) this.scrollParentContainer();
},
onDestroyed() {
this.componentParent().showOverlay.set(false);
},
updateCard(modifier) {
Cards.update(this.data()._id, {
$set: modifier,
});
this.parentComponent().parentComponent().showOverlay.set(false);
},
events() {
const events = {
[`${CSSEvents.transitionend} .js-card-details`]() {
this.isLoaded.set(true);
},
[`${CSSEvents.animationend} .js-card-details`]() {
this.isLoaded.set(true);
},
};
return [_.extend(events, {
'click .js-close-card-details'() {
return [{
...events,
'click .js-close-card-details' () {
Utils.goBoardId(this.data().boardId);
},
'click .js-open-card-details-menu': Popup.open('cardDetailsActions'),
'submit .js-card-description'(evt) {
'submit .js-card-description' (evt) {
evt.preventDefault();
const description = this.currentComponent().getValue();
this.updateCard({ description });
this.data().setDescription(description);
},
'submit .js-card-details-title'(evt) {
'submit .js-card-details-title' (evt) {
evt.preventDefault();
const title = this.currentComponent().getValue();
if ($.trim(title)) {
this.updateCard({ title });
const title = this.currentComponent().getValue().trim();
if (title) {
this.data().setTitle(title);
}
},
'click .js-member': Popup.open('cardMember'),
'click .js-add-members': Popup.open('cardMembers'),
'click .js-add-labels': Popup.open('cardLabels'),
'mouseenter .js-card-details'() {
this.componentParent().showOverlay.set(true);
this.componentParent().mouseHasEnterCardDetails = true;
'mouseenter .js-card-details' () {
this.parentComponent().parentComponent().showOverlay.set(true);
this.parentComponent().parentComponent().mouseHasEnterCardDetails = true;
},
})];
'click #toggleButton'() {
Meteor.call('toggleSystemMessages');
},
}];
},
}).register('cardDetails');
@@ -111,12 +129,12 @@ BlazeComponent.extendComponent({
close(isReset = false) {
if (this.isOpen.get() && !isReset) {
const draft = $.trim(this.getValue());
const draft = this.getValue().trim();
if (draft !== Cards.findOne(Session.get('currentCard')).description) {
UnsavedEdits.set(this._getUnsavedEditKey(), this.getValue());
}
}
super();
super.close();
}
reset() {
@@ -133,51 +151,256 @@ BlazeComponent.extendComponent({
}
}).register('inlinedCardDescription');
Template.cardDetailsActionsPopup.helpers({
isWatching() {
return this.findWatcher(Meteor.userId());
},
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
});
Template.cardDetailsActionsPopup.events({
'click .js-members': Popup.open('cardMembers'),
'click .js-labels': Popup.open('cardLabels'),
'click .js-attachments': Popup.open('cardAttachments'),
'click .js-start-date': Popup.open('editCardStartDate'),
'click .js-due-date': Popup.open('editCardDueDate'),
'click .js-spent-time': Popup.open('editCardSpentTime'),
'click .js-move-card': Popup.open('moveCard'),
// 'click .js-copy': Popup.open(),
'click .js-archive'(evt) {
'click .js-copy-card': Popup.open('copyCard'),
'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
'click .js-move-card-to-top' (evt) {
evt.preventDefault();
Cards.update(this._id, {
$set: {
archived: true,
},
});
const minOrder = _.min(this.list().cards(this.swimlaneId).map((c) => c.sort));
this.move(this.swimlaneId, this.listId, minOrder - 1);
},
'click .js-move-card-to-bottom' (evt) {
evt.preventDefault();
const maxOrder = _.max(this.list().cards(this.swimlaneId).map((c) => c.sort));
this.move(this.swimlaneId, this.listId, maxOrder + 1);
},
'click .js-archive' (evt) {
evt.preventDefault();
this.archive();
Popup.close();
},
'click .js-more': Popup.open('cardMore'),
'click .js-toggle-watch-card' () {
const currentCard = this;
const level = currentCard.findWatcher(Meteor.userId()) ? null : 'watching';
Meteor.call('watch', 'card', currentCard._id, level, (err, ret) => {
if (!err && ret) Popup.close();
});
},
});
Template.editCardTitleForm.onRendered(function () {
autosize(this.$('.js-edit-card-title'));
});
Template.editCardTitleForm.events({
'keydown .js-edit-card-title' (evt) {
// If enter key was pressed, submit the data
// Unless the shift key is also being pressed
if (evt.keyCode === 13 && !evt.shiftKey) {
$('.js-submit-edit-card-title-form').click();
}
},
});
Template.moveCardPopup.events({
'click .js-select-list'() {
'click .js-done' () {
// XXX We should *not* get the currentCard from the global state, but
// instead from a “component” state.
const cardId = Session.get('currentCard');
const newListId = this._id;
Cards.update(cardId, {
$set: {
listId: newListId,
},
});
const card = Cards.findOne(Session.get('currentCard'));
const lSelect = $('.js-select-lists')[0];
const newListId = lSelect.options[lSelect.selectedIndex].value;
const slSelect = $('.js-select-swimlanes')[0];
card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
card.move(card.swimlaneId, newListId, 0);
Popup.close();
},
});
BlazeComponent.extendComponent({
onCreated() {
subManager.subscribe('board', Session.get('currentBoard'));
this.selectedBoardId = new ReactiveVar(Session.get('currentBoard'));
},
boards() {
const boards = Boards.find({
archived: false,
'members.userId': Meteor.userId(),
}, {
sort: ['title'],
});
return boards;
},
swimlanes() {
const board = Boards.findOne(this.selectedBoardId.get());
return board.swimlanes();
},
aBoardLists() {
const board = Boards.findOne(this.selectedBoardId.get());
return board.lists();
},
events() {
return [{
'change .js-select-boards'(evt) {
this.selectedBoardId.set($(evt.currentTarget).val());
subManager.subscribe('board', this.selectedBoardId.get());
},
}];
},
}).register('boardsAndLists');
Template.copyCardPopup.events({
'click .js-done'() {
const card = Cards.findOne(Session.get('currentCard'));
const oldId = card._id;
card._id = null;
const lSelect = $('.js-select-lists')[0];
card.listId = lSelect.options[lSelect.selectedIndex].value;
const slSelect = $('.js-select-swimlanes')[0];
card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
const bSelect = $('.js-select-boards')[0];
card.boardId = bSelect.options[bSelect.selectedIndex].value;
const textarea = $('#copy-card-title');
const title = textarea.val().trim();
// insert new card to the bottom of new list
card.sort = Lists.findOne(card.listId).cards().count();
if (title) {
card.title = title;
card.coverId = '';
const _id = Cards.insert(card);
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
// card will disappear instantly.
// See https://github.com/wekan/wekan/issues/80
Filter.addException(_id);
// copy checklists
let cursor = Checklists.find({cardId: oldId});
cursor.forEach(function() {
'use strict';
const checklist = arguments[0];
checklist.cardId = _id;
checklist._id = null;
Checklists.insert(checklist);
});
// copy card comments
cursor = CardComments.find({cardId: oldId});
cursor.forEach(function () {
'use strict';
const comment = arguments[0];
comment.cardId = _id;
comment._id = null;
CardComments.insert(comment);
});
Popup.close();
}
},
});
Template.copyChecklistToManyCardsPopup.events({
'click .js-select-list' (evt) {
const card = Cards.findOne(Session.get('currentCard'));
const oldId = card._id;
card._id = null;
card.listId = this._id;
const list = Lists.findOne(card.listId);
card.boardId = list.boardId;
const textarea = $(evt.currentTarget).parents('.content').find('textarea');
const titleEntry = textarea.val().trim();
// insert new card to the bottom of new list
card.sort = Lists.findOne(this._id).cards().count();
if (titleEntry) {
const titleList = JSON.parse(titleEntry);
for (let i = 0; i < titleList.length; i++){
const obj = titleList[i];
card.title = obj.title;
card.description = obj.description;
card.coverId = '';
const _id = Cards.insert(card);
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
// card will disappear instantly.
// See https://github.com/wekan/wekan/issues/80
Filter.addException(_id);
// copy checklists
let cursor = Checklists.find({cardId: oldId});
cursor.forEach(function() {
'use strict';
const checklist = arguments[0];
checklist.cardId = _id;
checklist._id = null;
Checklists.insert(checklist);
});
// copy card comments
cursor = CardComments.find({cardId: oldId});
cursor.forEach(function () {
'use strict';
const comment = arguments[0];
comment.cardId = _id;
comment._id = null;
CardComments.insert(comment);
});
}
Popup.close();
}
},
});
Template.cardMorePopup.events({
'click .js-delete': Popup.afterConfirm('cardDelete', () => {
'click .js-copy-card-link-to-clipboard' () {
// Clipboard code from:
// https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser
const StringToCopyElement = document.getElementById('cardURL');
StringToCopyElement.select();
if (document.execCommand('copy')) {
StringToCopyElement.blur();
} else {
document.getElementById('cardURL').selectionStart = 0;
document.getElementById('cardURL').selectionEnd = 999;
document.execCommand('copy');
if (window.getSelection) {
if (window.getSelection().empty) { // Chrome
window.getSelection().empty();
} else if (window.getSelection().removeAllRanges) { // Firefox
window.getSelection().removeAllRanges();
}
} else if (document.selection) { // IE?
document.selection.empty();
}
}
},
'click .js-delete': Popup.afterConfirm('cardDelete', function () {
Popup.close();
Cards.remove(this._id);
Utils.goBoardId(this.board()._id);
Utils.goBoardId(this.boardId);
}),
});
// Close the card details pane by pressing escape
EscapeActions.register('detailsPane',
() => { Utils.goBoardId(Session.get('currentBoard')); },
() => { return !Session.equals('currentCard', null); }, {
() => {
Utils.goBoardId(Session.get('currentBoard'));
},
() => {
return !Session.equals('currentCard', null);
}, {
noClickEscapeOn: '.js-card-details,.board-sidebar,#header',
}
);
+28 -2
View File
@@ -2,7 +2,6 @@
.card-details
padding: 0 20px
height: 100%
flex-shrink: 0
flex-basis: 470px
will-change: flex-basis
@@ -36,6 +35,11 @@
font-size: 17px
padding: 10px
.card-details-watch
font-size: 17px
padding-left: 7px
color: #a6a6a6
.card-details-title
font-weight: bold
font-size: 1.33em
@@ -68,8 +72,13 @@
margin: 15px 0
.card-details-item
margin-right: 0.5em
&:last-child
margin-right: 0
&.card-details-item-labels,
&.card-details-item-members
&.card-details-item-members,
&.card-details-item-start,
&.card-details-item-due
width: 50%
flex-shrink: 1
@@ -94,3 +103,20 @@ input[type="submit"].attachment-add-link-submit
margin: 0 0 8px 4px
padding: 6px 12px
width: 18%
@media screen and (max-width: 800px)
.card-details
width: calc(100% - 40px)
padding: 0px 20px 0px 20px
margin: 0px
transition: none
.card-details-canvas
width: 100%
.card-details-header
.close-card-details
margin-right: 0px
.card-details-menu
margin-right: 10px
+22
View File
@@ -0,0 +1,22 @@
template(name="editCardSpentTime")
.edit-card-time
form.edit-time
.fields
label(for="time") {{_ 'time'}}
input.js-time-field#time(type="number" step="0.01" name="time" value="{{card.spentTime}}" placeholder=timeFormat autofocus)
label(for="overtime") {{_ 'overtime'}}
a.js-toggle-overtime
.materialCheckBox#overtime(class="{{#if card.isOvertime}}is-checked{{/if}}" name="overtime")
if error.get
.warning {{_ error.get}}
button.primary.wide.left.js-submit-time(type="submit") {{_ 'save'}}
button.js-delete-time.negate.wide.right {{_ 'delete'}}
template(name="timeBadge")
if canModifyCard
a.js-edit-time.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}")
| {{showTime}}
else
a.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}")
| {{showTime}}
+81
View File
@@ -0,0 +1,81 @@
BlazeComponent.extendComponent({
template() {
return 'editCardSpentTime';
},
onCreated() {
this.error = new ReactiveVar('');
this.card = this.data();
},
toggleOvertime() {
this.card.isOvertime = !this.card.isOvertime;
$('#overtime .materialCheckBox').toggleClass('is-checked');
$('#overtime').toggleClass('is-checked');
},
storeTime(spentTime, isOvertime) {
this.card.setSpentTime(spentTime);
this.card.setOvertime(isOvertime);
},
deleteTime() {
this.card.unsetSpentTime();
},
events() {
return [{
//TODO : need checking this portion
'submit .edit-time'(evt) {
evt.preventDefault();
const spentTime = parseFloat(evt.target.time.value);
const isOvertime = this.card.isOvertime;
if (spentTime >= 0) {
this.storeTime(spentTime, isOvertime);
Popup.close();
} else {
this.error.set('invalid-time');
evt.target.time.focus();
}
},
'click .js-delete-time'(evt) {
evt.preventDefault();
this.deleteTime();
Popup.close();
},
'click a.js-toggle-overtime': this.toggleOvertime,
}];
},
}).register('editCardSpentTimePopup');
BlazeComponent.extendComponent({
template() {
return 'timeBadge';
},
onCreated() {
const self = this;
self.time = ReactiveVar();
},
showTitle() {
if (this.data().isOvertime) {
return `${TAPi18n.__('overtime')} ${this.data().spentTime} ${TAPi18n.__('hours')}`;
} else {
return `${TAPi18n.__('card-spent')} ${this.data().spentTime} ${TAPi18n.__('hours')}`;
}
},
showTime() {
return this.data().spentTime;
},
isOvertime() {
return this.data().isOvertime;
},
events() {
return [{
'click .js-edit-time': Popup.open('editCardSpentTime'),
}];
},
}).register('cardSpentTime');
Template.timeBadge.helpers({
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
});
+17
View File
@@ -0,0 +1,17 @@
.card-time
display: block
border-radius: 4px
padding: 1px 3px
color: #fff
background-color: #dbdbdb
&:hover, &.is-active
background-color: #b3b3b3
time
&::before
font: normal normal normal 14px/1 FontAwesome
font-size: inherit
-webkit-font-smoothing: antialiased
content: "\f017" // clock symbol
margin-right: 0.3em
+97
View File
@@ -0,0 +1,97 @@
template(name="checklists")
h2 {{_ 'checklists'}}
if toggleDeleteDialog.get
.board-overlay#card-details-overlay
+checklistDeleteDialog(checklist = checklistToDelete)
.card-checklist-items
each checklist in currentCard.checklists
+checklistDetail(checklist = checklist)
if canModifyCard
+inlinedForm(autoclose=false classNames="js-add-checklist" cardId = cardId)
+addChecklistItemForm
else
a.js-open-inlined-form
i.fa.fa-plus
| {{_ 'add-checklist'}}...
template(name="checklistDetail")
+inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
+editChecklistItemForm(checklist = checklist)
else
.checklist-title
.checkbox.fa.fa-check-square-o
if canModifyCard
a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}...
span.checklist-stat(class="{{#if checklist.isFinished}}is-finished{{/if}}") {{checklist.finishedCount}}/{{checklist.itemCount}}
if canModifyCard
h2.title.js-open-inlined-form.is-editable
+viewer
= checklist.title
else
h2.title
+viewer
= checklist.title
+checklistItems(checklist = checklist)
template(name="checklistDeleteDialog")
.js-confirm-checklist-delete
p
i(class="fa fa-exclamation-triangle" aria-hidden="true")
p
| {{_ 'confirm-checklist-delete-dialog'}}
span {{checklist.title}}
| ?
.js-checklist-delete-buttons
button.confirm-checklist-delete(type="button") {{_ 'delete'}}
button.toggle-delete-checklist-dialog(type="button") {{_ 'cancel'}}
template(name="addChecklistItemForm")
textarea.js-add-checklist-item(rows='1' autofocus)
.edit-controls.clearfix
button.primary.confirm.js-submit-add-checklist-item-form(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-close-inlined-form
template(name="editChecklistItemForm")
textarea.js-edit-checklist-item(rows='1' autofocus)
if $eq type 'item'
= item.title
else
= checklist.title
.edit-controls.clearfix
button.primary.confirm.js-submit-edit-checklist-item-form(type="submit") {{_ 'save'}}
a.fa.fa-times-thin.js-close-inlined-form
span(title=createdAt) {{ moment createdAt }}
if canModifyCard
a.js-delete-checklist-item {{_ "delete"}}...
template(name="checklistItems")
.checklist-items.js-checklist-items
each item in checklist.getItemsSorted
+inlinedForm(classNames="js-edit-checklist-item" item = item checklist = checklist)
+editChecklistItemForm(type = 'item' item = item checklist = checklist)
else
+itemDetail(item = item checklist = checklist)
if canModifyCard
+inlinedForm(autoclose=false classNames="js-add-checklist-item" checklist = checklist)
+addChecklistItemForm
else
a.add-checklist-item.js-open-inlined-form
i.fa.fa-plus
| {{_ 'add-checklist-item'}}...
template(name='itemDetail')
.item.js-checklist-item
if canModifyCard
.check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
.item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}")
+viewer
= item.title
else
.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
.item-title(class="{{#if item.isFinished }}is-checked{{/if}}")
+viewer
= item.title
+222
View File
@@ -0,0 +1,222 @@
function initSorting(items) {
items.sortable({
tolerance: 'pointer',
helper: 'clone',
items: '.js-checklist-item:not(.placeholder)',
axis: 'y',
distance: 7,
placeholder: 'placeholder',
scroll: false,
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
EscapeActions.executeUpTo('popup-close');
},
stop(evt, ui) {
const parent = ui.item.parents('.js-checklist-items');
const orderedItems = [];
parent.find('.js-checklist-item').each(function(i, item) {
const checklistItem = Blaze.getData(item).item;
orderedItems.push(checklistItem._id);
});
items.sortable('cancel');
const formerParent = ui.item.parents('.js-checklist-items');
const checklist = Blaze.getData(parent.get(0)).checklist;
const oldChecklist = Blaze.getData(formerParent.get(0)).checklist;
if (oldChecklist._id !== checklist._id) {
const currentItem = Blaze.getData(ui.item.get(0)).item;
for (let i = 0; i < orderedItems.length; i++) {
const itemId = orderedItems[i];
if (itemId !== currentItem._id) continue;
const newItem = {
_id: checklist.getNewItemId(),
title: currentItem.title,
sort: i,
isFinished: currentItem.isFinished,
};
checklist.addFullItem(newItem);
orderedItems[i] = currentItem._id;
oldChecklist.removeItem(itemId);
}
} else {
checklist.sortItems(orderedItems);
}
},
});
}
Template.checklists.onRendered(function () {
const self = BlazeComponent.getComponentForElement(this.firstNode);
self.itemsDom = this.$('.card-checklist-items');
initSorting(self.itemsDom);
self.itemsDom.mousedown(function(evt) {
evt.stopPropagation();
});
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember();
}
// Disable sorting if the current user is not a board member
self.autorun(() => {
const $itemsDom = $(self.itemsDom);
if ($itemsDom.data('sortable')) {
$(self.itemsDom).sortable('option', 'disabled', !userIsMember());
}
});
});
BlazeComponent.extendComponent({
addChecklist(event) {
event.preventDefault();
const textarea = this.find('textarea.js-add-checklist-item');
const title = textarea.value.trim();
const cardId = this.currentData().cardId;
const card = Cards.findOne(cardId);
if (title) {
Checklists.insert({
cardId,
title,
sort: card.checklists().count(),
});
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');
const title = textarea.value.trim();
const checklist = this.currentData().checklist;
if (title) {
checklist.addItem(title);
}
// We keep the form opened, empty it.
textarea.value = '';
textarea.focus();
},
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
deleteChecklist() {
const checklist = this.currentData().checklist;
if (checklist && checklist._id) {
Checklists.remove(checklist._id);
this.toggleDeleteDialog.set(false);
}
},
deleteItem() {
const checklist = this.currentData().checklist;
const item = this.currentData().item;
if (checklist && item && item._id) {
checklist.removeItem(item._id);
}
},
editChecklist(event) {
event.preventDefault();
const textarea = this.find('textarea.js-edit-checklist-item');
const title = textarea.value.trim();
const checklist = this.currentData().checklist;
checklist.setTitle(title);
},
editChecklistItem(event) {
event.preventDefault();
const textarea = this.find('textarea.js-edit-checklist-item');
const title = textarea.value.trim();
const itemId = this.currentData().item._id;
const checklist = this.currentData().checklist;
checklist.editItem(itemId, title);
},
onCreated() {
this.toggleDeleteDialog = new ReactiveVar(false);
this.checklistToDelete = null; //Store data context to pass to checklistDeleteDialog template
},
pressKey(event) {
//If user press enter key inside a form, submit it
//Unless the user is also holding down the 'shift' key
if (event.keyCode === 13 && !event.shiftKey) {
event.preventDefault();
const $form = $(event.currentTarget).closest('form');
$form.find('button[type=submit]').click();
}
},
events() {
const events = {
'click .toggle-delete-checklist-dialog'(event) {
if($(event.target).hasClass('js-delete-checklist')){
this.checklistToDelete = this.currentData().checklist; //Store data context
}
this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get());
},
};
return [{
...events,
'submit .js-add-checklist': this.addChecklist,
'submit .js-edit-checklist-title': this.editChecklist,
'submit .js-add-checklist-item': this.addChecklistItem,
'submit .js-edit-checklist-item': this.editChecklistItem,
'click .js-delete-checklist-item': this.deleteItem,
'click .confirm-checklist-delete': this.deleteChecklist,
keydown: this.pressKey,
}];
},
}).register('checklists');
Template.checklistDeleteDialog.onCreated(() => {
const $cardDetails = this.$('.card-details');
this.scrollState = { position: $cardDetails.scrollTop(), //save current scroll position
top: false, //required for smooth scroll animation
};
//Callback's purpose is to only prevent scrolling after animation is complete
$cardDetails.animate({ scrollTop: 0 }, 500, () => { this.scrollState.top = true; });
//Prevent scrolling while dialog is open
$cardDetails.on('scroll', () => {
if(this.scrollState.top) { //If it's already in position, keep it there. Otherwise let animation scroll
$cardDetails.scrollTop(0);
}
});
});
Template.checklistDeleteDialog.onDestroyed(() => {
const $cardDetails = this.$('.card-details');
$cardDetails.off('scroll'); //Reactivate scrolling
$cardDetails.animate( { scrollTop: this.scrollState.position });
});
Template.itemDetail.helpers({
canModifyCard() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
});
BlazeComponent.extendComponent({
toggleItem() {
const checklist = this.currentData().checklist;
const item = this.currentData().item;
if (checklist && item && item._id) {
checklist.toggleItem(item._id);
}
},
events() {
return [{
'click .item .check-box': this.toggleItem,
}];
},
}).register('itemDetail');
+111
View File
@@ -0,0 +1,111 @@
.js-add-checklist
color: #8c8c8c
textarea.js-add-checklist-item, textarea.js-edit-checklist-item
overflow: hidden
word-wrap: break-word
resize: none
height: 34px
.delete-text
color: #8c8c8c
text-decoration: underline
word-wrap: break-word
float: right
padding-top: 6px
&:hover
color: inherit
.checklist-title
.checkbox
float: left
width: 30px
height 30px
font-size: 18px
line-height: 30px
.title
font-size: 18px
line-height: 30px
.checklist-stat
margin: 0 0.5em
float: right
padding-top: 6px
&.is-finished
color: #3cb500
.js-delete-checklist
@extends .delete-text
.js-confirm-checklist-delete
background-color: darken(white, 3%)
position: absolute
float: left;
width: 60%
margin-top: 0
margin-left: 13%
padding-bottom: 2%
padding-left: 3%
padding-right: 3%
z-index: 17
border-radius: 3px
p
position: relative
margin-top: 3%
width: 100%
text-align: center
span
font-weight: bold
i
font-size: 2em
.js-checklist-delete-buttons
position: relative
padding: left 2% right 2%
.confirm-checklist-delete
margin-left: 12%
float: left
.toggle-delete-checklist-dialog
margin-right: 12%
float: right
#card-details-overlay
top: 0
bottom: -600px
right: 0
.checklist-items
margin: 0 0 0.5em 1.33em
.item
line-height: 25px
font-size: 1.1em
margin-top: 3px
display: flex
&:hover
background-color: darken(white, 8%)
.check-box
margin-top: 5px
&.is-checked
border-bottom: 2px solid #3cb500
border-right: 2px solid #3cb500
.item-title
flex: 1
padding-left: 10px;
&.is-checked
color: #8c8c8c
font-style: italic
.js-delete-checklist-item
@extends .delete-text
padding: 12px 0 0 0
.add-checklist-item
padding-top: 0.5em
display: inline-block
+3 -2
View File
@@ -18,7 +18,7 @@ template(name="editLabelPopup")
form.edit-label
+formLabel
button.primary.wide.left(type="submit") {{_ 'save'}}
span.right
button.js-delete-label.negate.wide.right {{_ 'delete'}}
template(name="deleteLabelPopup")
p {{_ "label-delete-pop"}}
@@ -34,4 +34,5 @@ template(name="cardLabelsPopup")
= name
if(isLabelSelected ../_id)
i.card-label-selectable-icon.fa.fa-check
a.quiet-button.full.js-add-label {{_ 'label-create'}}
if currentUser.isBoardAdmin
a.quiet-button.full.js-add-label {{_ 'label-create'}}
+12 -53
View File
@@ -4,18 +4,12 @@ Meteor.startup(() => {
});
BlazeComponent.extendComponent({
template() {
return 'formLabel';
},
onCreated() {
this.currentColor = new ReactiveVar(this.data().color);
},
labels() {
return _.map(labelColors, (color) => {
return { color, name: '' };
});
return labelColors.map((color) => ({ color, name: '' }));
},
isSelected(color) {
@@ -45,19 +39,9 @@ Template.createLabelPopup.helpers({
Template.cardLabelsPopup.events({
'click .js-select-label'(evt) {
const cardId = Template.parentData(2).data._id;
const card = Cards.findOne(Session.get('currentCard'));
const labelId = this._id;
let operation;
if (Cards.find({ _id: cardId, labelIds: labelId}).count() === 0)
operation = '$addToSet';
else
operation = '$pull';
Cards.update(cardId, {
[operation]: {
labelIds: labelId,
},
});
card.toggleLabel(labelId);
evt.preventDefault();
},
'click .js-edit-label': Popup.open('editLabel'),
@@ -79,52 +63,27 @@ Template.formLabel.events({
Template.createLabelPopup.events({
// Create the new label
'submit .create-label'(evt, tpl) {
const name = tpl.$('#labelName').val().trim();
const boardId = Session.get('currentBoard');
const color = Blaze.getData(tpl.find('.fa-check')).color;
Boards.update(boardId, {
$push: {
labels: {
name,
color,
_id: Random.id(6),
},
},
});
Popup.back();
evt.preventDefault();
const board = Boards.findOne(Session.get('currentBoard'));
const name = tpl.$('#labelName').val().trim();
const color = Blaze.getData(tpl.find('.fa-check')).color;
board.addLabel(name, color);
Popup.back();
},
});
Template.editLabelPopup.events({
'click .js-delete-label': Popup.afterConfirm('deleteLabel', function() {
const boardId = Session.get('currentBoard');
Boards.update(boardId, {
$pull: {
labels: {
_id: this._id,
},
},
});
const board = Boards.findOne(Session.get('currentBoard'));
board.removeLabel(this._id);
Popup.back(2);
}),
'submit .edit-label'(evt, tpl) {
evt.preventDefault();
const board = Boards.findOne(Session.get('currentBoard'));
const name = tpl.$('#labelName').val().trim();
const boardId = Session.get('currentBoard');
const getLabel = Utils.getLabelIndex(boardId, this._id);
const color = Blaze.getData(tpl.find('.fa-check')).color;
Boards.update(boardId, {
$set: {
[getLabel.key('name')]: name,
[getLabel.key('color')]: color,
},
});
board.editLabel(this._id, name, color);
Popup.back();
},
});
+20 -4
View File
@@ -1,13 +1,25 @@
template(name="minicard")
.minicard
if cover
.minicard-cover
img(src=cover.url)
.minicard-cover(style="background-image: url('{{cover.url}}');")
if labels
.minicard-labels
each labels
.minicard-label(class="card-label-{{color}}" title="{{name}}")
.minicard-title= title
.minicard-title
+viewer
= title
.dates
if startAt
.date
+minicardStartDate
if dueAt
.date
+minicardDueDate
if spentTime
.date
+cardSpentTime
if members
.minicard-members.js-minicard-members
each members
@@ -15,7 +27,7 @@ template(name="minicard")
.badges
if comments.count
.badge(title="{{_ 'card-comments-title' comments.count }}")
span.badge-icon.fa.fa-comment-o
span.badge-icon.fa.fa-comment-o.badge-comment
span.badge-text= comments.count
if description
.badge.badge-state-image-only(title=description)
@@ -24,3 +36,7 @@ template(name="minicard")
.badge
span.badge-icon.fa.fa-paperclip
span.badge-text= attachments.count
if checklists.count
.badge(class="{{#if checklistFinished}}is-finished{{/if}}")
span.badge-icon.fa.fa-check-square-o
span.badge-text.check-list-text {{checklistFinishedCount}}/{{checklistItemCount}}
+37 -9
View File
@@ -1,3 +1,5 @@
@import 'nib'
.minicard-wrapper
cursor: pointer
position: relative
@@ -60,16 +62,11 @@
.minicard-cover
background-position: center
background-repeat: no-repeat
background-size: cover
background-size: contain
height: 145px
user-select: none
margin: -6px -8px 6px -8px
border-radius: top 2px
position: relative
img
height: 100%
width: 100%
.minicard-labels
float: right
@@ -80,7 +77,15 @@
height: @width
border-radius: 2px
margin-left: 3px
.minicard-title
p:last-child
margin-bottom: 0
.dates
display: flex;
flex-direction: row;
flex-wrap: wrap;
.date
margin-right: 3px
.badges
float: left
margin-top: 7px
@@ -94,15 +99,28 @@
margin-right: 11px
margin-bottom: 3px
font-size: 0.9em
&.is-finished
background: #3cb500
padding: 0px 3px
border-radius: 3px
color: white
&:last-of-type
margin-right: 0
.badge-icon,
.badge-text
vertical-align: top
vertical-align: middle
&.badge-comment
margin-bottom: 0.1rem
.badge-text
font-size: 0.9em
padding-left: 2px
line-height: 14px
.check-list-text
padding-left: 0px
line-height: 12px
.minicard-members
float: right
@@ -133,5 +151,15 @@
margin: 0
padding: 0
max-height: 162px
min-height: 54px
min-height: 36px
margin-bottom: 20px
overflow-y: auto
@media screen and (max-width: 800px)
.minicard
.is-selected &
transform: translateX(0px)
border-bottom-right-radius: 0
border-top-right-radius: 0
z-index: 15
box-shadow: 0 1px 2px rgba(0,0,0,.15)
+67 -1
View File
@@ -617,8 +617,74 @@ button
margin-right: 5px
vertical-align: middle
.minicard-label
width: 11px
height: @width
border-radius: 2px
margin: 2px 7px -2px -2px
display: inline-block
&.active
background: #005377
a
a, .quiet
color: white
// Material Design Toggle Switch
.material-toggle-switch
display: flex
.toggle-label
position: relative
display: block
height: 20px
width: 44px
background-color: #a6a6a6
border-radius: 100px
cursor: pointer
transition: all 0.3s ease
&:after
position: absolute
left: -2px
top: -3px
display: block
width: 26px
height: 26px
border-radius: 100px
background-color: #fff
box-shadow: 0px 3px 3px rgba(0,0,0,0.05)
content: ''
transition: all 0.3s ease
&:active
&:after
transform: scale(1.15, 0.85)
.toggle-switch:checked ~ .toggle-label
background-color: #6fbeb5
&:after
left: 20px
background-color: #179588
.toggle-switch:checked:disabled ~ .toggle-label
background-color: #d5d5d5
pointer-events: none
&:after
background-color: #bcbdbc
.toggle-switch
display: none
.toggle-switch-title
margin: 0 0.5em
display: flex
@media screen and (max-width: 800px)
.edit-controls,
.add-controls
.fa-times-thin
margin: 3px 20px
+70
View File
@@ -0,0 +1,70 @@
template(name="importHeaderBar")
h1
a.back-btn(href="{{pathFor 'home'}}")
i.fa.fa-chevron-left
| {{_ title}}
template(name="import")
.wrapper
if error.get
.warning {{_ error.get}}
+Template.dynamic(template=currentTemplate)
template(name="importTextarea")
form
p: label(for='import-textarea') {{_ instruction}}
textarea.js-import-json(placeholder="{{_ 'import-json-placeholder'}}" autofocus)
| {{jsonText}}
if isSandstorm
h1.warning DANGER !!! THIS DESTROYS YOUR IMPORTED DATA, CAUSES BOARD NOT FOUND ERROR WHEN YOU OPEN THIS GRAIN AGAIN https://github.com/wekan/wekan/issues/1430
p.warning {{_ 'import-sandstorm-warning'}}
input.primary.wide(type="submit" value="{{_ 'import'}}")
template(name="importMapMembers")
h2 {{_ 'import-map-members'}}
.map-members
p {{_ 'import-members-map'}}
.mapping-list
each members
a.mapping-item.js-select-member(class="{{#if wekanId}}filled{{/if}}")
.profile-source
.full-name= fullName
.username
| ({{username}})
.wekan
if wekanId
+userAvatar(userId=wekanId)
else
a.member.add-member
i.fa.fa-plus
//-
Due to the way the flewbox layout is working, we need to set some
invisible items so that the last row items have a consistent width.
See http://jsfiddle.net/Ln4h3c4n/ for an minimal example of the issue.
.mapping-item.ghost-item
.mapping-item.ghost-item
.mapping-item.ghost-item
.mapping-item.ghost-item
.mapping-item.ghost-item
form
input.primary.wide(type="submit" value="{{_ 'done'}}")
template(name="importMapMembersAddPopup")
.select-member
p
| {{_ 'import-user-select'}}
.js-map-member
+esInput(index="users")
ul.pop-over-list
+esEach(index="users")
li.item.js-member-item
a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{_id}}")
+userAvatar(userId=_id esSearch=true)
span.full-name
= profile.fullname
| (<span class="username">{{username}}</span>)
+ifEsIsSearching(index='users')
+spinner
+ifEsHasNoResults(index="users")
.manage-member-section
p.quiet {{_ 'no-results'}}
+243
View File
@@ -0,0 +1,243 @@
import trelloMembersMapper from './trelloMembersMapper';
import wekanMembersMapper from './wekanMembersMapper';
BlazeComponent.extendComponent({
title() {
return `import-board-title-${Session.get('importSource')}`;
},
}).register('importHeaderBar');
BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
this.steps = ['importTextarea', 'importMapMembers'];
this._currentStepIndex = new ReactiveVar(0);
this.importedData = new ReactiveVar();
this.membersToMap = new ReactiveVar([]);
this.importSource = Session.get('importSource');
},
currentTemplate() {
return this.steps[this._currentStepIndex.get()];
},
nextStep() {
const nextStepIndex = this._currentStepIndex.get() + 1;
if (nextStepIndex >= this.steps.length) {
this.finishImport();
} else {
this._currentStepIndex.set(nextStepIndex);
}
},
importData(evt) {
evt.preventDefault();
const dataJson = this.find('.js-import-json').value;
try {
const dataObject = JSON.parse(dataJson);
this.setError('');
this.importedData.set(dataObject);
const membersToMap = this._prepareAdditionalData(dataObject);
// store members data and mapping in Session
// (we go deep and 2-way, so storing in data context is not a viable option)
this.membersToMap.set(membersToMap);
this.nextStep();
} catch (e) {
this.setError('error-json-malformed');
}
},
setError(error) {
this.error.set(error);
},
finishImport() {
const additionalData = {};
const membersMapping = this.membersToMap.get();
if (membersMapping) {
const mappingById = {};
membersMapping.forEach((member) => {
if (member.wekanId) {
mappingById[member.id] = member.wekanId;
}
});
additionalData.membersMapping = mappingById;
}
this.membersToMap.set([]);
Meteor.call('importBoard',
this.importedData.get(),
additionalData,
this.importSource,
Session.get('fromBoard'),
(err, res) => {
if (err) {
this.setError(err.error);
} else {
Session.set('fromBoard', null);
Utils.goBoardId(res);
}
}
);
},
_prepareAdditionalData(dataObject) {
const importSource = Session.get('importSource');
let membersToMap;
switch (importSource) {
case 'trello':
membersToMap = trelloMembersMapper.getMembersToMap(dataObject);
break;
case 'wekan':
membersToMap = wekanMembersMapper.getMembersToMap(dataObject);
break;
}
return membersToMap;
},
_screenAdditionalData() {
return 'mapMembers';
},
}).register('import');
BlazeComponent.extendComponent({
template() {
return 'importTextarea';
},
instruction() {
return `import-board-instruction-${Session.get('importSource')}`;
},
events() {
return [{
submit(evt) {
return this.parentComponent().importData(evt);
},
}];
},
}).register('importTextarea');
BlazeComponent.extendComponent({
onCreated() {
this.autorun(() => {
this.parentComponent().membersToMap.get().forEach(({ wekanId }) => {
if (wekanId) {
this.subscribe('user-miniprofile', wekanId);
}
});
});
},
members() {
return this.parentComponent().membersToMap.get();
},
_refreshMembers(listOfMembers) {
return this.parentComponent().membersToMap.set(listOfMembers);
},
/**
* Will look into the list of members to import for the specified memberId,
* then set its property to the supplied value.
* If unset is true, it will remove the property from the rest of the list as well.
*
* use:
* - memberId = null to use selected member
* - value = null to unset a property
* - unset = true to ensure property is only set on 1 member at a time
*/
_setPropertyForMember(property, value, memberId, unset = false) {
const listOfMembers = this.members();
let finder = null;
if(memberId) {
finder = (member) => member.id === memberId;
} else {
finder = (member) => member.selected;
}
listOfMembers.forEach((member) => {
if(finder(member)) {
if(value !== null) {
member[property] = value;
} else {
delete member[property];
}
if(!unset) {
// we shortcut if we don't care about unsetting the others
return false;
}
} else if(unset) {
delete member[property];
}
return true;
});
// Session.get gives us a copy, we have to set it back so it sticks
this._refreshMembers(listOfMembers);
},
setSelectedMember(memberId) {
return this._setPropertyForMember('selected', true, memberId, true);
},
/**
* returns the member with specified id,
* or the selected member if memberId is not specified
*/
getMember(memberId = null) {
const allMembers = this.members();
let finder = null;
if (memberId) {
finder = (user) => user.id === memberId;
} else {
finder = (user) => user.selected;
}
return allMembers.find(finder);
},
mapSelectedMember(wekanId) {
return this._setPropertyForMember('wekanId', wekanId, null);
},
unmapMember(memberId){
return this._setPropertyForMember('wekanId', null, memberId);
},
onSubmit(evt) {
evt.preventDefault();
this.parentComponent().nextStep();
},
onMapMember(evt) {
const memberToMap = this.currentData();
if(memberToMap.wekan) {
// todo xxx ask for confirmation?
this.unmapMember(memberToMap.id);
} else {
this.setSelectedMember(memberToMap.id);
Popup.open('importMapMembersAdd')(evt);
}
},
events() {
return [{
'submit': this.onSubmit,
'click .js-select-member': this.onMapMember,
}];
},
}).register('importMapMembers');
BlazeComponent.extendComponent({
onRendered() {
this.find('.js-map-member input').focus();
},
onSelectUser(){
Popup.getOpenerComponent().mapSelectedMember(this.currentData()._id);
Popup.back();
},
events() {
return [{
'click .js-select-import': this.onSelectUser,
}];
},
}).register('importMapMembersAddPopup');
+49
View File
@@ -0,0 +1,49 @@
@import 'nib'
.map-members
&:after
content: "";
flex: auto;
.mapping-list
display: flex
flex-wrap: wrap
margin: 0 -4px
.mapping-item
max-width: 300px
min-width: 200px
padding: 6px
margin: 5px
flex:1
background: white
border-radius: 3px
box-shadow: 0 1px 2px rgba(0,0,0,.15)
&:hover
background: darken(white, 5%)
&.filled
background: #E0FFE5
&:hover
background: #FFE0E0
&.ghost-item
height: 0
visibility: hidden
border: none
.profile-source
display: inline-block
width: 80%
.wekan
display: inline-block
width: 35px
.member
float: none
a.show-mapping
text-decoration underline
@@ -0,0 +1,14 @@
export function getMembersToMap(data) {
// we will work on the list itself (an ordered array of objects) when a
// mapping is done, we add a 'wekan' field to the object representing the
// imported member
const membersToMap = data.members;
// auto-map based on username
membersToMap.forEach((importedMember) => {
const wekanUser = Users.findOne({ username: importedMember.username });
if (wekanUser) {
importedMember.wekanId = wekanUser._id;
}
});
return membersToMap;
}
@@ -0,0 +1,24 @@
export function getMembersToMap(data) {
// we will work on the list itself (an ordered array of objects) when a
// mapping is done, we add a 'wekan' field to the object representing the
// imported member
const membersToMap = data.members;
const users = data.users;
// auto-map based on username
membersToMap.forEach((importedMember) => {
importedMember.id = importedMember.userId;
delete importedMember.userId;
const user = users.filter((user) => {
return user._id === importedMember.id;
})[0];
if (user.profile && user.profile.fullname) {
importedMember.fullName = user.profile.fullname;
}
importedMember.username = user.username;
const wekanUser = Users.findOne({ username: importedMember.username });
if (wekanUser) {
importedMember.wekanId = wekanUser._id;
}
});
return membersToMap;
}
+4
View File
@@ -2,3 +2,7 @@ template(name='list')
.list.js-list(id="js-list-{{_id}}")
+listHeader
+listBody
template(name='miniList')
a.mini-list.js-select-list.js-list(id="js-list-{{_id}}")
+listHeader
+29 -30
View File
@@ -1,13 +1,9 @@
const { calculateIndex } = Utils;
BlazeComponent.extendComponent({
template() {
return 'list';
},
// Proxy
openForm(options) {
this.componentChildren('listBody')[0].openForm(options);
this.childComponents('listBody')[0].openForm(options);
},
onCreated() {
@@ -22,16 +18,18 @@ BlazeComponent.extendComponent({
// callback, we basically solve all issues related to reactive updates. A
// comment below provides further details.
onRendered() {
if (!Meteor.user() || !Meteor.user().isBoardMember())
return;
const boardComponent = this.parentComponent().parentComponent();
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
}
const boardComponent = this.componentParent();
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
const $cards = this.$('.js-minicards');
$cards.sortable({
connectWith: '.js-minicards',
connectWith: '.js-minicards:not(.js-list-full)',
tolerance: 'pointer',
appendTo: 'body',
appendTo: '.board-canvas',
helper(evt, item) {
const helper = item.clone();
if (MultiSelection.isActive()) {
@@ -47,11 +45,10 @@ BlazeComponent.extendComponent({
},
distance: 7,
items: itemsSelector,
scroll: false,
placeholder: 'minicard-wrapper placeholder',
start(evt, ui) {
ui.placeholder.height(ui.helper.height());
EscapeActions.executeUpTo('popup');
EscapeActions.executeUpTo('popup-close');
boardComponent.setIsDragging(true);
},
stop(evt, ui) {
@@ -62,6 +59,7 @@ BlazeComponent.extendComponent({
const nCards = MultiSelection.isActive() ? MultiSelection.count() : 1;
const sortIndex = calculateIndex(prevCardDom, nextCardDom, nCards);
const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
const swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
// Normally the jquery-ui sortable library moves the dragged DOM element
// to its new position, which disrupts Blaze reactive updates mechanism
@@ -73,28 +71,23 @@ BlazeComponent.extendComponent({
$cards.sortable('cancel');
if (MultiSelection.isActive()) {
Cards.find(MultiSelection.getMongoSelector()).forEach((c, i) => {
Cards.update(c._id, {
$set: {
listId,
sort: sortIndex.base + i * sortIndex.increment,
},
});
Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => {
card.move(swimlaneId, listId, sortIndex.base + i * sortIndex.increment);
});
} else {
const cardDomElement = ui.item.get(0);
const cardId = Blaze.getData(cardDomElement)._id;
Cards.update(cardId, {
$set: {
listId,
sort: sortIndex.base,
},
});
const card = Blaze.getData(cardDomElement);
card.move(swimlaneId, listId, sortIndex.base);
}
boardComponent.setIsDragging(false);
},
});
// Disable drag-dropping if the current user is not a board member or is comment only
this.autorun(() => {
$cards.sortable('option', 'disabled', !userIsMember());
});
// We want to re-run this function any time a card is added.
this.autorun(() => {
const currentBoardId = Tracker.nonreactive(() => {
@@ -107,19 +100,25 @@ BlazeComponent.extendComponent({
accept: '.js-member,.js-label',
drop(event, ui) {
const cardId = Blaze.getData(this)._id;
let addToSet;
const card = Cards.findOne(cardId);
if (ui.draggable.hasClass('js-member')) {
const memberId = Blaze.getData(ui.draggable.get(0)).userId;
addToSet = { members: memberId };
card.assignMember(memberId);
} else {
const labelId = Blaze.getData(ui.draggable.get(0))._id;
addToSet = { labelIds: labelId };
card.addLabel(labelId);
}
Cards.update(cardId, { $addToSet: addToSet });
},
});
});
});
},
}).register('list');
Template.miniList.events({
'click .js-select-list'() {
const listId = this._id;
Session.set('currentList', listId);
},
});
+88 -4
View File
@@ -9,8 +9,8 @@
// Even if this background color is the same as the body we can't leave it
// transparent, because that won't work during a list drag.
background: darken(white, 13%)
height: 100%
border-left: 1px solid darken(white, 20%)
border-bottom: 1px solid #CCC
padding: 0
float: left
@@ -53,6 +53,9 @@
&.ui-sortable-handle
cursor: grab
.list-header-left-icon
display: none
.list-header-name
display: inline
font-size: 16px
@@ -65,21 +68,34 @@
text-overflow: ellipsis
word-wrap: break-word
.list-header-menu-icon
.list-header-watch-icon
padding-left: 10px
color: #a6a6a6
.list-header-menu
position: absolute
padding: 7px
margin-top: 1px
top: -@padding
right: -@padding
.list-header-plus-icon
color: #a6a6a6
margin-right: 10px
.highlight
color: #ce1414
.list-body
flex: 1
flex: 1 1 auto
flex-direction: column
display: flex
overflow-y: auto
padding: 5px 11px
.minicards
flex: 1
flex-grow: 1
flex-shrink: 0
form
margin-bottom: 9px
@@ -103,3 +119,71 @@
background: #fafafa
color: #222
box-shadow: 0 1px 2px rgba(0,0,0,.2)
#js-wip-limit-edit
padding-top: 2%
p
margin-bottom: 0
input
display: inline-block
.wip-limit-value
width: 20%
margin-right: 5%
.wip-limit-error
display: none
.soft-wip-limit
margin-right: 8px
div
float: left
@media screen and (max-width: 800px)
.mini-list
flex: 0 0 60px
height: 60px
width: 100%
border-left: 0px
border-bottom: 1px solid darken(white, 20%)
.list
display: block
width: 100%
border-left: 0px
&.ui-sortable-helper
flex: 0 0 60px
height: 60px
width: 100%
border-left: 0px
border-bottom: 1px solid darken(white, 20%)
.list-header.ui-sortable-handle
cursor: grabbing
&.placeholder
flex: 0 0 60px
height: 60px
width: 100%
border-left: 0px
border-bottom: 1px solid darken(white, 20%)
.list-header
.list-header-left-icon
display: inline
padding: 7px
padding-right: 27px
margin-top: 1px
top: -@padding
left: -@padding
.list-header-menu-icon
position: absolute
padding: 7px
top: -@padding
right: 17px
+16 -5
View File
@@ -1,10 +1,10 @@
template(name="listBody")
.list-body.js-perfect-scrollbar
.minicards.clearfix.js-minicards
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
if cards.count
+inlinedForm(autoclose=false position="top")
+addCardForm(listId=_id position="top")
each cards
each (cards (idOrNull ../../_id))
a.minicard-wrapper.js-minicard(href=absoluteUrl
class="{{#if cardIsSelected}}is-selected{{/if}}"
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
@@ -12,7 +12,7 @@ template(name="listBody")
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
+minicard(this)
if currentUser.isBoardMember
if canSeeAddCard
+inlinedForm(autoclose=false position="bottom")
+addCardForm(listId=_id position="bottom")
else
@@ -22,9 +22,20 @@ template(name="listBody")
template(name="addCardForm")
.minicard.minicard-composer.js-composer
.minicard-detailss.clearfix
textarea.minicard-composer-textarea.js-card-title(autofocus)
if getLabels
.minicard-labels
each getLabels
.minicard-label(class="card-label-{{color}}" title="{{name}}")
textarea.minicard-composer-textarea.js-card-title(autofocus)
if members.get
.minicard-members.js-minicard-composer-members
each members.get
+userAvatar(userId=this)
.add-controls.clearfix
button.primary.confirm(type="submit") {{_ 'add'}}
a.fa.fa-times-thin.js-close-inlined-form
template(name="autocompleteLabelLine")
.minicard-label(class="card-label-{{colorName}}" title=labelName)
span(class="{{#if hasNoName}}quiet{{/if}}")= labelName
+134 -11
View File
@@ -1,8 +1,4 @@
BlazeComponent.extendComponent({
template() {
return 'listBody';
},
mixins() {
return [Mixins.PerfectScrollbar];
},
@@ -11,8 +7,8 @@ BlazeComponent.extendComponent({
options = options || {};
options.position = options.position || 'top';
const forms = this.componentChildren('inlinedForm');
let form = _.find(forms, (component) => {
const forms = this.childComponents('inlinedForm');
let form = forms.find((component) => {
return component.data().position === options.position;
});
if (!form && forms.length > 0) {
@@ -26,8 +22,10 @@ BlazeComponent.extendComponent({
const firstCardDom = this.find('.js-minicard:first');
const lastCardDom = this.find('.js-minicard:last');
const textarea = $(evt.currentTarget).find('textarea');
const title = textarea.val();
const position = Blaze.getData(evt.currentTarget).position;
const position = this.currentData().position;
const title = textarea.val().trim();
const formComponent = this.childComponents('addCardForm')[0];
let sortIndex;
if (position === 'top') {
sortIndex = Utils.calculateIndex(null, firstCardDom).base;
@@ -35,12 +33,26 @@ BlazeComponent.extendComponent({
sortIndex = Utils.calculateIndex(lastCardDom, null).base;
}
if ($.trim(title)) {
const members = formComponent.members.get();
const labelIds = formComponent.labels.get();
const boardId = this.data().board()._id;
const board = Boards.findOne(boardId);
let swimlaneId = '';
if (board.view === 'board-view-swimlanes')
swimlaneId = this.parentComponent().parentComponent().data()._id;
else
swimlaneId = Swimlanes.findOne({boardId})._id;
if (title) {
const _id = Cards.insert({
title,
members,
labelIds,
listId: this.data()._id,
boardId: this.data().board()._id,
sort: sortIndex,
swimlaneId,
});
// In case the filter is active we need to add the newly inserted card in
// the list of exceptions -- cards that are not filtered. Otherwise the
@@ -50,9 +62,12 @@ BlazeComponent.extendComponent({
// We keep the form opened, empty it, and scroll to it.
textarea.val('').focus();
autosize.update(textarea);
if (position === 'bottom') {
this.scrollToBottom();
}
formComponent.reset();
}
},
@@ -90,6 +105,22 @@ BlazeComponent.extendComponent({
MultiSelection.toggle(this.currentData()._id);
},
idOrNull(swimlaneId) {
const board = Boards.findOne(Session.get('currentBoard'));
if (board.view === 'board-view-swimlanes')
return swimlaneId;
return undefined;
},
canSeeAddCard() {
return !this.reachedWipLimit() && Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
},
reachedWipLimit() {
const list = Template.currentData();
return !list.getWipLimit('soft') && list.getWipLimit('enabled') && list.getWipLimit('value') <= list.cards().count();
},
events() {
return [{
'click .js-minicard': this.clickOnMiniCard,
@@ -100,9 +131,33 @@ BlazeComponent.extendComponent({
},
}).register('listBody');
function toggleValueInReactiveArray(reactiveValue, value) {
const array = reactiveValue.get();
const valueIndex = array.indexOf(value);
if (valueIndex === -1) {
array.push(value);
} else {
array.splice(valueIndex, 1);
}
reactiveValue.set(array);
}
BlazeComponent.extendComponent({
template() {
return 'addCardForm';
onCreated() {
this.labels = new ReactiveVar([]);
this.members = new ReactiveVar([]);
},
reset() {
this.labels.set([]);
this.members.set([]);
},
getLabels() {
const currentBoardId = Session.get('currentBoard');
return Boards.findOne(currentBoardId).labels.filter((label) => {
return this.labels.get().indexOf(label._id) > -1;
});
},
pressKey(evt) {
@@ -140,4 +195,72 @@ BlazeComponent.extendComponent({
keydown: this.pressKey,
}];
},
onRendered() {
const editor = this;
const $textarea = this.$('textarea');
autosize($textarea);
$textarea.escapeableTextComplete([
// User mentions
{
match: /\B@([\w.]*)$/,
search(term, callback) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
callback($.map(currentBoard.activeMembers(), (member) => {
const user = Users.findOne(member.userId);
return user.username.indexOf(term) === 0 ? user : null;
}));
},
template(user) {
return user.username;
},
replace(user) {
toggleValueInReactiveArray(editor.members, user._id);
return '';
},
index: 1,
},
// Labels
{
match: /\B#(\w*)$/,
search(term, callback) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
callback($.map(currentBoard.labels, (label) => {
if (label.name.indexOf(term) > -1 ||
label.color.indexOf(term) > -1) {
return label;
}
return null;
}));
},
template(label) {
return Blaze.toHTMLWithData(Template.autocompleteLabelLine, {
hasNoName: !label.name,
colorName: label.color,
labelName: label.name || label.color,
});
},
replace(label) {
toggleValueInReactiveArray(editor.labels, label._id);
return '';
},
index: 1,
},
], {
// When the autocomplete menu is shown we want both a press of both `Tab`
// or `Enter` to validation the auto-completion. We also need to stop the
// event propagation to prevent the card from submitting (on `Enter`) or
// going on the next column (on `Tab`).
onKeydown(evt, commands) {
if (evt.keyCode === 9 || evt.keyCode === 13) {
evt.stopPropagation();
return commands.KEY_ENTER;
}
return null;
},
});
},
}).register('addCardForm');
+86 -16
View File
@@ -3,11 +3,40 @@ template(name="listHeader")
+inlinedForm
+editListTitleForm
else
if isMiniScreen
if currentList
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
h2.list-header-name(
class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
= title
if currentUser.isBoardMember
a.list-header-menu-icon.fa.fa-ellipsis-v.js-open-list-menu
if wipLimit.enabled
|&nbsp;(
span(class="{{#if reachedWipLimit}}highlight{{/if}}") {{cards.count}}
|/#{wipLimit.value})
if showCardsCountForList cards.count
= cards.count
span.lowercase
| {{_ 'cards'}}
if isMiniScreen
if currentList
if isWatching
i.list-header-watch-icon.fa.fa-eye
div.list-header-menu
unless currentUser.isCommentOnly
if canSeeAddCard
a.js-add-card.fa.fa-plus.list-header-plus-icon
a.fa.fa-navicon.js-open-list-menu
else
a.list-header-menu-icon.fa.fa-angle-right.js-select-list
else if currentUser.isBoardMember
if isWatching
i.list-header-watch-icon.fa.fa-eye
div.list-header-menu
unless currentUser.isCommentOnly
if canSeeAddCard
a.js-add-card.fa.fa-plus.list-header-plus-icon
a.fa.fa-navicon.js-open-list-menu
template(name="editListTitleForm")
.list-composer
@@ -18,17 +47,22 @@ template(name="editListTitleForm")
template(name="listActionPopup")
ul.pop-over-list
li: a.js-add-card {{_ 'add-card'}}
if cards.count
li: a.js-select-cards {{_ 'list-select-cards'}}
li: a.js-move-cards {{_ 'list-move-cards'}}
li: a.js-archive-cards {{_ 'list-archive-cards'}}
hr
ul.pop-over-list
li: a.js-close-list {{_ 'archive-list'}}
template(name="listMoveCardsPopup")
+boardLists
li: a.js-toggle-watch-list {{#if isWatching}}{{_ 'unwatch'}}{{else}}{{_ 'watch'}}{{/if}}
unless currentUser.isCommentOnly
hr
ul.pop-over-list
if cards.count
li: a.js-select-cards {{_ 'list-select-cards'}}
hr
if currentUser.isBoardAdmin
ul.pop-over-list
li: a.js-set-wip-limit {{#if isWipLimitEnabled }}{{_ 'edit-wip-limit'}}{{else}}{{_ 'setWipLimitPopup-title'}}{{/if}}
hr
ul.pop-over-list
li: a.js-close-list {{_ 'archive-list'}}
hr
ul.pop-over-list
li: a.js-more {{_ 'listMorePopup-title'}}
template(name="boardLists")
ul.pop-over-list
@@ -39,6 +73,42 @@ template(name="boardLists")
else
a.js-select-list= title
template(name="listArchiveCardsPopup")
p {{_ 'list-archive-cards-pop'}}
input.js-confirm.negate.full(type="submit" value="{{_ 'archive-all'}}")
template(name="listMorePopup")
p.quiet
span.clearfix
span {{_ 'link-list'}}
= ' '
i.fa.colorful(class="{{#if board.isPublic}}fa-globe{{else}}fa-lock{{/if}}")
input.inline-input(type="text" readonly value="{{ rootUrl }}")
| {{_ 'added'}}
span.date(title=list.createdAt) {{ moment createdAt 'LLL' }}
a.js-delete {{_ 'delete'}}
template(name="listDeletePopup")
p {{_ "list-delete-pop"}}
unless archived
p {{_ "list-delete-suggest-archive"}}
button.js-confirm.negate.full(type="submit") {{_ 'delete'}}
template(name="setWipLimitPopup")
#js-wip-limit-edit
label {{_ 'set-wip-limit-value'}}
ul.pop-over-list
li: a.js-enable-wip-limit {{_ 'enable-wip-limit'}}
if isWipLimitEnabled
i.fa.fa-check
if isWipLimitEnabled
p
input.wip-limit-value(type="number" value="{{ wipLimitValue }}" min="1" max="99")
input.wip-limit-apply(type="submit" value="{{_ 'apply'}}")
input.wip-limit-error
p
.soft-wip-limit
.materialCheckBox(class="{{#if isWipLimitSoft}}is-checked{{/if}}")
label {{_ 'soft-wip-limit'}}
template(name="wipLimitErrorPopup")
.wip-limit-invalid
p {{_ 'wipLimitErrorPopup-dialog-pt1'}}
p {{_ 'wipLimitErrorPopup-dialog-pt2'}}
button.full.js-back-view(type="submit") {{_ 'cancel'}}
+122 -55
View File
@@ -1,78 +1,145 @@
BlazeComponent.extendComponent({
template() {
return 'listHeader';
canSeeAddCard() {
const list = Template.currentData();
return !list.getWipLimit('enabled') || list.getWipLimit('soft') || !this.reachedWipLimit();
},
editTitle(evt) {
evt.preventDefault();
const form = this.componentChildren('inlinedForm')[0];
const newTitle = form.getValue();
if ($.trim(newTitle)) {
Lists.update(this.currentData()._id, {
$set: {
title: newTitle,
},
});
const newTitle = this.childComponents('inlinedForm')[0].getValue().trim();
const list = this.currentData();
if (newTitle) {
list.rename(newTitle.trim());
}
},
isWatching() {
const list = this.currentData();
return list.findWatcher(Meteor.userId());
},
limitToShowCardsCount() {
return Meteor.user().getLimitToShowCardsCount();
},
reachedWipLimit() {
const list = Template.currentData();
return list.getWipLimit('enabled') && list.getWipLimit('value') <= list.cards().count();
},
showCardsCountForList(count) {
return count > this.limitToShowCardsCount();
},
events() {
return [{
'click .js-open-list-menu': Popup.open('listAction'),
'click .js-add-card' () {
const listDom = document.getElementById(`js-list-${this.currentData()._id}`);
const listComponent = BlazeComponent.getComponentForElement(listDom);
listComponent.openForm({
position: 'top',
});
},
'click .js-unselect-list'() {
Session.set('currentList', null);
},
submit: this.editTitle,
}];
},
}).register('listHeader');
Template.listActionPopup.events({
'click .js-add-card'() {
const listDom = document.getElementById(`js-list-${this._id}`);
const listComponent = BlazeComponent.getComponentForElement(listDom);
listComponent.openForm({ position: 'top' });
Popup.close();
Template.listActionPopup.helpers({
isWipLimitEnabled() {
return Template.currentData().getWipLimit('enabled');
},
'click .js-list-subscribe'() {},
'click .js-select-cards'() {
const cardIds = Cards.find(
{listId: this._id},
{fields: { _id: 1 }}
).map((card) => card._id);
MultiSelection.add(cardIds);
Popup.close();
},
'click .js-move-cards': Popup.open('listMoveCards'),
'click .js-archive-cards': Popup.afterConfirm('listArchiveCards', () => {
Cards.find({listId: this._id}).forEach((card) => {
Cards.update(card._id, {
$set: {
archived: true,
},
});
});
Popup.close();
}),
'click .js-close-list'(evt) {
evt.preventDefault();
Lists.update(this._id, {
$set: {
archived: true,
},
});
Popup.close();
isWatching() {
return this.findWatcher(Meteor.userId());
},
});
Template.listMoveCardsPopup.events({
'click .js-select-list'() {
const fromList = Template.parentData(2).data._id;
const toList = this._id;
Cards.find({ listId: fromList }).forEach((card) => {
Cards.update(card._id, {
$set: {
listId: toList,
},
});
});
Template.listActionPopup.events({
'click .js-list-subscribe' () {},
'click .js-select-cards' () {
const cardIds = this.allCards().map((card) => card._id);
MultiSelection.add(cardIds);
Popup.close();
},
'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();
});
},
'click .js-close-list' (evt) {
evt.preventDefault();
this.archive();
Popup.close();
},
'click .js-set-wip-limit': Popup.open('setWipLimit'),
'click .js-more': Popup.open('listMore'),
});
BlazeComponent.extendComponent({
applyWipLimit() {
const list = Template.currentData();
const limit = parseInt(Template.instance().$('.wip-limit-value').val(), 10);
if(limit < list.cards().count() && !list.getWipLimit('soft')){
Template.instance().$('.wip-limit-error').click();
} else {
Meteor.call('applyWipLimit', list._id, limit);
Popup.back();
}
},
enableSoftLimit() {
const list = Template.currentData();
if(list.getWipLimit('soft') && list.getWipLimit('value') < list.cards().count()){
list.setWipLimit(list.cards().count());
}
Meteor.call('enableSoftLimit', Template.currentData()._id);
},
enableWipLimit() {
const list = Template.currentData();
// Prevent user from using previously stored wipLimit.value if it is less than the current number of cards in the list
if(!list.getWipLimit('enabled') && list.getWipLimit('value') < list.cards().count()){
list.setWipLimit(list.cards().count());
}
Meteor.call('enableWipLimit', list._id);
},
isWipLimitSoft() {
return Template.currentData().getWipLimit('soft');
},
isWipLimitEnabled() {
return Template.currentData().getWipLimit('enabled');
},
wipLimitValue(){
return Template.currentData().getWipLimit('value');
},
events() {
return [{
'click .js-enable-wip-limit': this.enableWipLimit,
'click .wip-limit-apply': this.applyWipLimit,
'click .wip-limit-error': Popup.open('wipLimitError'),
'click .materialCheckBox': this.enableSoftLimit,
}];
},
}).register('setWipLimitPopup');
Template.listMorePopup.events({
'click .js-delete': Popup.afterConfirm('listDelete', function () {
Popup.close();
this.allCards().map((card) => Cards.remove(card._id));
Lists.remove(this._id);
Utils.goBoardId(this.boardId);
}),
});
+13
View File
@@ -0,0 +1,13 @@
BlazeComponent.extendComponent({
currentCardIsInThisList(listId, swimlaneId) {
const currentCard = Cards.findOne(Session.get('currentCard'));
const currentBoardId = Session.get('currentBoard');
const board = Boards.findOne(currentBoardId);
if (board.view === 'board-view-lists')
return currentCard && currentCard.listId === listId;
else if (board.view === 'board-view-swimlanes')
return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId;
else
return false;
},
}).register('listsGroup');
+2 -3
View File
@@ -9,6 +9,5 @@ template(name="editor")
template(name="viewer")
.viewer
+mentions
+emoji
+markdown
{{> UI.contentBlock }}
+markdown
{{> UI.contentBlock }}
Regular → Executable
+33 -70
View File
@@ -1,39 +1,18 @@
let dropdownMenuIsOpened = false;
Template.editor.onRendered(() => {
const $textarea = this.$('textarea');
autosize($textarea);
$textarea.textcomplete([
// Emojies
{
match: /\B:([\-+\w]*)$/,
search(term, callback) {
callback($.map(Emoji.values, (emoji) => {
return emoji.indexOf(term) === 0 ? emoji : null;
}));
},
template(value) {
const imgSrc = Emoji.baseImagePath + value;
const image = `<img src="${imgSrc}.png" />`;
return image + value;
},
replace(value) {
return `:${value}:`;
},
index: 1,
},
$textarea.escapeableTextComplete([
// User mentions
{
match: /\B@(\w*)$/,
match: /\B@([\w.]*)$/,
search(term, callback) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
callback($.map(currentBoard.members, (member) => {
callback(currentBoard.activeMembers().map((member) => {
const username = Users.findOne(member.userId).username;
return username.indexOf(term) === 0 ? username : null;
}));
return username.includes(term) ? username : null;
}).filter(Boolean));
},
template(value) {
return value;
@@ -44,32 +23,12 @@ Template.editor.onRendered(() => {
index: 1,
},
]);
// Since commit d474017 jquery-textComplete automatically closes a potential
// opened dropdown menu when the user press Escape. This behavior conflicts
// with our EscapeActions system, but it's too complicated and hacky to
// monkey-pach textComplete to disable it -- I tried. Instead we listen to
// 'open' and 'hide' events, and create a ghost escapeAction when the dropdown
// is opened (and rely on textComplete to execute the actual action).
$textarea.on({
'textComplete:show'() {
dropdownMenuIsOpened = true;
},
'textComplete:hide'() {
Tracker.afterFlush(() => {
dropdownMenuIsOpened = false;
});
},
});
});
EscapeActions.register('textcomplete',
() => {},
() => dropdownMenuIsOpened
);
import sanitizeXss from 'xss';
// XXX I believe we should compute a HTML rendered field on the server that
// would handle markdown, emojies and user mentions. We can simply have two
// would handle markdown and user mentions. We can simply have two
// fields, one source, and one compiled version (in HTML) and send only the
// compiled version to most users -- who don't need to edit.
// In the meantime, all the transformation are done on the client using the
@@ -78,25 +37,27 @@ const at = HTML.CharRef({html: '&commat;', str: '@'});
Blaze.Template.registerHelper('mentions', new Template('mentions', function() {
const view = this;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const knowedUsers = _.map(currentBoard.members, (member) => {
const knowedUsers = currentBoard.members.map((member) => {
member.username = Users.findOne(member.userId).username;
return member;
});
const mentionRegex = /\B@(\w*)/gi;
const mentionRegex = /\B@([\w.]*)/gi;
let content = Blaze.toHTML(view.templateContentBlock);
let currentMention, knowedUser, linkClass, linkValue, link;
while (Boolean(currentMention = mentionRegex.exec(content))) {
knowedUser = _.findWhere(knowedUsers, { username: currentMention[1] });
if (!knowedUser)
let currentMention;
while ((currentMention = mentionRegex.exec(content)) !== null) {
const [fullMention, username] = currentMention;
const knowedUser = _.findWhere(knowedUsers, { username });
if (!knowedUser) {
continue;
}
linkValue = [' ', at, knowedUser.username];
linkClass = 'atMention js-open-member';
if (knowedUser.userId === Meteor.userId())
const linkValue = [' ', at, knowedUser.username];
let linkClass = 'atMention js-open-member';
if (knowedUser.userId === Meteor.userId()) {
linkClass += ' me';
link = HTML.A({
}
const link = HTML.A({
'class': linkClass,
// XXX Hack. Since we stringify this render function result below with
// `Blaze.toHTML` we can't rely on blaze data contexts to pass the
@@ -105,22 +66,17 @@ Blaze.Template.registerHelper('mentions', new Template('mentions', function() {
'data-userId': knowedUser.userId,
}, linkValue);
content = content.replace(currentMention[0], Blaze.toHTML(link));
content = content.replace(fullMention, Blaze.toHTML(link));
}
return HTML.Raw(content);
return HTML.Raw(sanitizeXss(content));
}));
Template.viewer.events({
'click .js-open-member'(evt, tpl) {
const userId = evt.currentTarget.dataset.userid;
Popup.open('member').call({ userId }, evt, tpl);
},
// Viewer sometimes have click-able wrapper around them (for instance to edit
// the corresponding text). Clicking a link shouldn't fire these actions, stop
// we stop these event at the viewer component level.
'click a'(evt) {
'click a'(evt, tpl) {
evt.stopPropagation();
// XXX We hijack the build-in browser action because we currently don't have
@@ -128,9 +84,16 @@ Template.viewer.events({
// handled by a third party package that we can't configure easily. Fix that
// by using directly `_blank` attribute in the rendered HTML.
evt.preventDefault();
const href = evt.currentTarget.href;
if (href) {
window.open(href, '_blank');
const userId = evt.currentTarget.dataset.userid;
if (userId) {
Popup.open('member').call({ userId }, evt, tpl);
}
else {
const href = evt.currentTarget.href;
if (href) {
window.open(href, '_blank');
}
}
},
});
+52 -33
View File
@@ -1,13 +1,25 @@
template(name="header")
#header(class=currentBoard.colorClass)
//-
If the user is connected we display a small "quick-access" top bar that
list all starred boards with a link to go there. This is inspired by the
Reddit "subreddit" bar.
The first link goes to the boards page.
unless isSandstorm
if currentUser
#header-quick-access
//-
If the user is connected we display a small "quick-access" top bar that
list all starred boards with a link to go there. This is inspired by the
Reddit "subreddit" bar.
The first link goes to the boards page.
unless isSandstorm
if currentUser
#header-quick-access(class=currentBoard.colorClass)
if isMiniScreen
ul
li
a(href="{{pathFor 'home'}}")
span.fa.fa-home
if currentList
each currentBoard.lists
li(class="{{#if $.Session.equals 'currentList' _id}}current{{/if}}")
a.js-select-list
= title
#header-new-board-icon
else
ul
li
a(href="{{pathFor 'home'}}")
@@ -21,37 +33,44 @@ template(name="header")
else
li.current {{_ 'quick-access-description'}}
a#header-new-board-icon.js-create-board
i.fa.fa-plus(title="Create a new board")
a#header-new-board-icon.js-create-board
i.fa.fa-plus(title="Create a new board")
+headerUserBar
+headerUserBar
#header(class=currentBoard.colorClass)
//-
The main bar is a colorful bar that provide all the meta-data for the
current page. This bar is contextual based.
If the user is not connected we display "sign in" and "log in" buttons.
#header-main-bar(class="{{#if wrappedHeader}}wrapper{{/if}}")
if $.Session.get 'currentBoard'
+headerBoard
else if($eq currentRouteName 'home')
+headerTitle
+Template.dynamic(template=headerBar)
//-
On sandstorm, the logo shouldn't be clickable, because we only have one
page/document on it, and we don't want to see the home page containing
the list of all boards.
if isSandstorm
.wekan-logo
img(src="/wekan-logo-header.png" alt="Wekan")
else
a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}")
img(src="/wekan-logo-header.png" alt="Wekan")
unless hideLogo
//-
On sandstorm, the logo shouldn't be clickable, because we only have one
page/document on it, and we don't want to see the home page containing
the list of all boards.
if isSandstorm
.wekan-logo
img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan")
else
a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}")
img(src="{{pathFor '/wekan-logo-header.png'}}" alt="Wekan")
template(name="headerTitle")
h1 {{_ 'my-boards'}}
if appIsOffline
+offlineWarning
.board-header-btns.right
a.board-header-btn.js-open-archived-board
i.fa.fa-archive
span {{_ 'archives'}}
if currentUser.isBoardMember
if hasAnnouncement
.announcement
p
i.fa.fa-bullhorn
| #{announcement}
i.fa.fa-times-circle.js-close-announcement
template(name="offlineWarning")
.offline-warning
p
i.fa.fa-warning
| {{_ 'app-is-offline'}}
+30 -6
View File
@@ -1,14 +1,38 @@
Template.header.helpers({
// Reactively set the color of the page from the color of the current board.
headerTemplate() {
return 'headerBoard';
},
Meteor.subscribe('user-admin');
Meteor.subscribe('boards');
Template.header.helpers({
wrappedHeader() {
return !Session.get('currentBoard');
},
hideLogo() {
return Utils.isMiniScreen() && Session.get('currentBoard');
},
appIsOffline() {
return !Meteor.status().connected;
},
hasAnnouncement() {
const announcements = Announcements.findOne();
return announcements && announcements.enabled;
},
announcement() {
$('.announcement').show();
const announcements = Announcements.findOne();
return announcements && announcements.body;
},
});
Template.header.events({
'click .js-create-board': Popup.open('createBoard'),
'click .js-create-board': Popup.open('headerBarCreateBoard'),
'click .js-close-announcement'() {
$('.announcement').hide();
},
'click .js-select-list'() {
Session.set('currentList', this._id);
Session.set('currentCard', null);
},
});
+154 -68
View File
@@ -4,76 +4,10 @@
color: white
transition: background-color 0.4s
background: #2980B9
#header-quick-access
background-color: rgba(0, 0, 0, 0.2)
padding: 0px 10px
height: 28px
font-size: 12px
display: flex
#header-user-bar,
#header-new-board-icon,
ul li
color: darken(white, 17%)
.fa
color: inherit
a:hover, a.is-active
color: white
ul
transition: opacity 0.2s
margin: 4px 0 0 5px
overflow: hidden
li
display: block
float: left
width: auto
color: darken(white, 15%)
padding: 2px 5px 0
&.current
color: darken(white, 5%)
&:first-child .fa-home
margin-right: 5px
a.js-create-board
margin-left: 5px
#header-user-bar,
#header-new-board-icon
flex-shrink: 0
#header-user-bar
margin: 2px 0
.header-user-bar-avatar
float: left
.member
width: 24px
height: @width
margin: 0
margin-top: 1px
.header-user-bar-name
margin: 4px 8px 0 0
float: left
i.fa-chevron-down
margin-right: 4px
#header-new-board-icon
flex-grow: 1
margin: 6px 5px 0
width: 12px
z-index: 17
#header-main-bar
height: 28px * 1.618034 - 6px
height: 40px
padding: 7px 10px 0
h1
@@ -85,6 +19,17 @@
float: left
border-radius: 3px
.board-header-watch-icon
padding-left: 7px
a.fa, a i.fa
color: white
.back-btn
font-size: 0.9em
margin-right: 10px
.wekan-logo
display: block
margin: 3px auto 0
@@ -147,3 +92,144 @@
border-left: 1px solid rgba(255, 255, 255, .3)
height: 24px
float: left
#header-quick-access
color: white
transition: background-color 0.4s
background: #2573a7
height: 28px
font-size: 12px
display: flex
z-index: 17
#header-user-bar,
#header-new-board-icon,
ul li
color: darken(white, 17%)
.fa
color: inherit
a:hover, a.is-active
color: white
ul
transition: opacity 0.2s
margin: 4px 0 0 5px
overflow: hidden
li
display: block
float: left
width: auto
color: darken(white, 15%)
padding: 2px 5px 0
&.current
color: darken(white, 5%)
&:first-child .fa-home
margin-right: 5px
a.js-create-board
margin-left: 5px
#header-user-bar,
#header-new-board-icon
flex-shrink: 0
#header-user-bar
margin: 2px 0
.header-user-bar-avatar
float: left
position: relative
top: -5px
margin-right: 5px
.member
width: 24px
height: @width
margin: 0
margin-top: 1px
.header-user-bar-name
margin: 4px 8px 0 0
float: left
i.fa-chevron-down
margin-right: 4px
#header-new-board-icon
flex-grow: 1
margin: 6px 5px 0
width: 12px
@media screen and (max-width: 800px)
#header
#header-main-bar
height: 40px
.board-header-btns
margin-top: 0px
.board-header-btn
height: 32px
line-height: @height
font-size: 16px
i.fa
line-height: 32px
+ span
display: none
#header-quick-access
transition: background-color 0.4s
width: 100%
padding: 10px 0px
z-index: 30
position: absolute
bottom: 0px
ul
width: calc(100% - 60px)
overflow: ellipsis
padding: 10px
margin: -10px
li
height: 100%
padding: 12px 0px
margin: -10px 0px
a
height: 100%
padding: 12px 10px
margin: -10px 0px
.fa-home
font-size: 26px
margin-top: -2px
#header-new-board-icon
display: none
#header-user-bar
position: absolute
right: 0px
padding: 10px
margin: -10px
.announcement,
.offline-warning
width: 100%
text-align: center
padding: 0
margin: 0
background: #F8ECBD
clear: both
p
margin: 7px
padding: 0
@@ -0,0 +1,19 @@
template(name="shortcutsHeaderBar")
h1
a.back-btn(href="{{pathFor 'home'}}")
i.fa.fa-chevron-left
| {{_ 'keyboard-shortcuts'}}
template(name="shortcutsModalTitle")
h2
i.fa.fa-keyboard-o
| {{_ 'keyboard-shortcuts'}}
template(name="keyboardShortcuts")
.wrapper.shortcuts-list
each mapping
.shortcuts-list-item
.shortcuts-list-item-keys
each keys
kbd= this
.shortcuts-list-item-action {{_ action}}
@@ -14,11 +14,6 @@
padding: 5px 8px
margin: 5px
font-size: 18px
font-weight: bold
background: white
border-radius: 3px
border: 1px solid darken(white, 10%)
box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.15)
.shortcuts-list-item-action
font-size: 1.4em
@@ -1,11 +0,0 @@
.wrapper.shortcuts-list
h2
i.fa.fa-keyboard-o
| {{_ 'keyboard-shortcuts'}}
each mapping
.shortcuts-list-item
.shortcuts-list-item-keys
each keys
kbd= this
.shortcuts-list-item-action {{_ action}}
+21 -4
View File
@@ -2,13 +2,28 @@ head
title Wekan
meta(name="viewport"
content="maximum-scale=1.0,width=device-width,initial-scale=1.0,user-scalable=0")
meta(http-equiv="X-UA-Compatible" content="IE=edge")
//- XXX We should use pathFor in the following `href` to support the case
where the application is deployed with a path prefix, but it seems to be
difficult to do that cleanly with Blaze -- at least without adding extra
packages.
link(rel="shortcut icon" href="/wekan-favicon.png")
link(rel="apple-touch-icon" href="/wekan-favicon.png")
link(rel="manifest" href="/wekan-manifest.json")
template(name="userFormsLayout")
section.auth-layout
h1.at-form-landing-logo
img(src="/wekan-logo.png" alt="Wekan")
+Template.dynamic(template=content)
img(src="{{pathFor '/wekan-logo.png'}}" alt="Wekan")
section.auth-dialog
+Template.dynamic(template=content)
div.at-form-lang
select.select-lang.js-userform-set-language
each languages
if isCurrentLanguage
option(value="{{tag}}" selected="selected") {{name}}
else
option(value="{{tag}}") {{name}}
template(name="defaultLayout")
+header
@@ -20,6 +35,7 @@ template(name="defaultLayout")
.modal-content
a.modal-close-btn.js-close-modal
i.fa.fa-times-thin
+Template.dynamic(template=Modal.getHeaderName)
+Template.dynamic(template=Modal.getTemplateName)
template(name="notFound")
@@ -28,5 +44,6 @@ template(name="notFound")
template(name="message")
.big-message.quiet(class=color)
h1 {{_ label}}
with(pathFor route='atSignIn')
p {{{_ 'page-maybe-private' this}}}
unless currentUser
with(pathFor route='atSignIn')
p {{{_ 'page-maybe-private' this}}}
+45 -2
View File
@@ -1,11 +1,54 @@
Meteor.subscribe('boards');
BlazeLayout.setRoot('body');
const i18nTagToT9n = (i18nTag) => {
// t9n/i18n tags are same now, see: https://github.com/softwarerero/meteor-accounts-t9n/pull/129
// but we keep this conversion function here, to be aware that that they are different system.
return i18nTag;
};
Template.userFormsLayout.onRendered(() => {
const i18nTag = navigator.language;
if (i18nTag) {
T9n.setLanguage(i18nTagToT9n(i18nTag));
}
EscapeActions.executeAll();
});
Template.userFormsLayout.helpers({
languages() {
return _.map(TAPi18n.getLanguages(), (lang, code) => {
const tag = code;
let name = lang.name;
if (lang.name === 'br') {
name = 'Brezhoneg';
} else if (lang.name === 'ig') {
name = 'Igbo';
}
return { tag, name };
}).sort(function(a, b) {
if (a.name === b.name) {
return 0;
} else {
return a.name > b.name ? 1 : -1;
}
});
},
isCurrentLanguage() {
const t9nTag = i18nTagToT9n(this.tag);
const curLang = T9n.getLanguage() || 'en';
return t9nTag === curLang;
},
});
Template.userFormsLayout.events({
'change .js-userform-set-language'(evt) {
const i18nTag = $(evt.currentTarget).val();
T9n.setLanguage(i18nTagToT9n(i18nTag));
evt.preventDefault();
},
});
Template.defaultLayout.events({
'click .js-close-modal': () => {
Modal.close();
+48 -9
View File
@@ -26,11 +26,15 @@ body
#content
position: relative
flex: 1
overflow: hidden
overflow-x: hidden
.sk-spinner
margin-top: 30vh
> .wrapper
margin-top: 10px
padding: 15px
#modal
position: absolute
top: 0
@@ -106,6 +110,9 @@ a
cursor: default
text-decoration: none
span a
text-decoration: underline
strong
font-weight: bold
@@ -172,6 +179,15 @@ dl, dt
dd
margin: 0 0 16px 24px
kbd
padding: 1px 3px
margin: 3px
font-weight: bold
background: darken(white, 2%)
border-radius: 3px
border: 1px solid darken(white, 10%)
box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.15)
.clear
clear: both
@@ -254,22 +270,20 @@ dd
.grabbing
cursor: grabbing
.emoji
height: 18px
width: 18px
vertical-align: text-bottom
// Implement a thiner close icon as suggested in
// https://github.com/FortAwesome/Font-Awesome/issues/1540#issuecomment-68689950
.fa.fa-times-thin:before
content: '\00d7';
.fa.fa-globe.colorful
.fa.fa-globe.colorful, .fa.fa-bell.colorful
color: #4caf50
.fa.fa-lock.colorful
.fa.fa-lock.colorful, .fa.fa-bell-slash.colorful
color: #f44336
.fa.fa-eye.colorful
color: #4336f4
.pop-over .pop-over-list li a:not(.disabled):hover
.fa, .fa.colorful
color: white
@@ -316,6 +330,8 @@ a
margin-left: 38px
.viewer
min-height: 18px
ol
list-style-type: decimal
padding-left: 20px
@@ -332,6 +348,11 @@ a
background: darken(white, 13%)
overflow-y: auto
a
text-decoration: underline
&:hover
color: #333
.basicTabs-container .tabs-content-container
padding: 0
padding-top: 15px
@@ -342,4 +363,22 @@ a
@keyframes flexGrowIn
from
flex-basis: 0
// Support IE11 https://github.com/wekan/wekan/pull/646
height: 100%
@media screen and (max-width: 800px)
#content
margin: 1px 0px 49px 0px
height: calc(100% - 96px)
> .wrapper
margin-top: 0px
.wrapper
height: 100%
margin: 0px
.inline-input
height: 37px
margin: 8px 10px 0 0
width: 50px
+89 -4
View File
@@ -17,9 +17,11 @@ $popupWidth = 300px
margin: 4px -10px
width: $popupWidth
p,
textarea,
input[type="text"],
input[type="email"],
input[type="password"]
input[type="password"],
input[type="file"]
margin: 4px 0 12px
width: 100%
@@ -30,8 +32,6 @@ $popupWidth = 300px
textarea
height: 72px
margin: 4px 0 12px
width: 100%
.header
height: 36px
@@ -83,7 +83,7 @@ $popupWidth = 300px
transition: transform 0.2s
.content
width: 300 - 20px
width: $popupWidth - 20px
padding: 0 10px 10px
float: left
@@ -243,3 +243,88 @@ $popupWidth = 300px
&:hover
text-decoration: underline
@media screen and (max-width: 800px)
.pop-over
width: 100%
height: 100%
overflow: hidden
margin-top: 0px
border: 0px solid #dbdbdb
.header
color: white
background: #2980B9
height: 48px
padding: 0px 0px
border: 0px
margin: 0px 0px
width: 100%
position: absolute
top: 0px
.header-title
font-size: 20px
font-weight: normal
padding-top: 8px
.back-btn
width: 30px
padding: 8px 12px 8px 12px
i.fa
color: white
.close-btn
padding: 10px 12px
i.fa
font-size: 24px
color: white
.content-wrapper
width: 100%
height: calc(100% - 48px)
overflow-y: scroll
overflow-x: hidden
margin: 48px 0px 0px 0px
.content-container
width: 1000%
height: 100%
max-height: 100%
.content
width: calc(10% - 20px)
height: calc(100% - 20px)
padding: 10px
form
margin: 10px 10px
width: calc(100% - 20px)
p,
textarea,
input[type="text"],
input[type="email"],
input[type="password"],
input[type="file"]
margin: 4px 0 12px
width: 100%
.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}
transform: translateX(- depth * 10%)
+2
View File
@@ -1,3 +1,5 @@
@import 'nib'
/*
* From https://github.com/tobiasahlin/SpinKit
*
@@ -17,11 +17,6 @@ Mixins.InfiniteScrolling = BlazeComponent.extendComponent({
this._nextPeak = Infinity;
},
// To be overwritten by consumers of this mixin
reachNextPeak() {
},
events() {
return [{
scroll(evt) {
@@ -29,7 +24,7 @@ Mixins.InfiniteScrolling = BlazeComponent.extendComponent({
let altitude = domElement.scrollTop + domElement.offsetHeight;
altitude += peakAnticipation;
if (altitude >= this.callFirstWith(null, 'getNextPeak')) {
this.callFirstWith(null, 'reachNextPeak');
this.mixinParent().callFirstWith(null, 'reachNextPeak');
}
},
}];
@@ -0,0 +1,51 @@
template(name='information')
.setting-content
unless currentUser.isAdmin
| {{_ 'error-notAuthorized'}}
else
.content-title
span {{_ 'info'}}
.content-body
.side-menu
ul
li.active
a.js-setting-menu(data-id="information-display") {{_ 'info'}}
.main-body
+statistics
template(name='statistics')
table
tbody
tr
th {{_ 'Wekan_version'}}
td {{statistics.version}}
tr
th {{_ 'Node_version'}}
td {{statistics.process.nodeVersion}}
tr
th {{_ 'OS_Type'}}
td {{statistics.os.type}}
tr
th {{_ 'OS_Platform'}}
td {{statistics.os.platform}}
tr
th {{_ 'OS_Arch'}}
td {{statistics.os.arch}}
tr
th {{_ 'OS_Release'}}
td {{statistics.os.release}}
tr
th {{_ 'OS_Uptime'}}
td {{humanReadableTime statistics.os.uptime}}
tr
th {{_ 'OS_Loadavg'}}
td {{numFormat statistics.os.loadavg.[0]}}, {{numFormat statistics.os.loadavg.[1]}}, {{numFormat statistics.os.loadavg.[2]}}
tr
th {{_ 'OS_Totalmem'}}
td {{bytesToSize statistics.os.totalmem}}
tr
th {{_ 'OS_Freemem'}}
td {{bytesToSize statistics.os.freemem}}
tr
th {{_ 'OS_Cpus'}}
td {{statistics.os.cpus.length}}
@@ -0,0 +1,48 @@
BlazeComponent.extendComponent({
onCreated() {
this.info = new ReactiveVar({});
Meteor.call('getStatistics', (error, ret) => {
if (!error && ret) {
this.info.set(ret);
}
});
},
statistics() {
return this.info.get();
},
humanReadableTime(time) {
const days = Math.floor(time / 86400);
const hours = Math.floor((time % 86400) / 3600);
const minutes = Math.floor(((time % 86400) % 3600) / 60);
const seconds = Math.floor(((time % 86400) % 3600) % 60);
let out = '';
if (days > 0) {
out += `${days} ${TAPi18n.__('days')}, `;
}
if (hours > 0) {
out += `${hours} ${TAPi18n.__('hours')}, `;
}
if (minutes > 0) {
out += `${minutes} ${TAPi18n.__('minutes')}, `;
}
if (seconds > 0) {
out += `${seconds} ${TAPi18n.__('seconds')}`;
}
return out;
},
numFormat(number) {
return parseFloat(number).toFixed(2);
},
bytesToSize(bytes) {
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
if (bytes === 0) {
return '0 Byte';
}
const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
return `${Math.round(bytes / Math.pow(1024, i), 2)} ${sizes[i]}`;
},
}).register('statistics');
@@ -0,0 +1,5 @@
template(name='invitationCode')
.at-input#invitationcode
label(for='at-field-code') {{_ 'invitation-code'}}
input#at-field-invitationcode(type="text" name='at-field-invitationcode' placeholder="{{_ 'invitation-code'}}")
@@ -0,0 +1,6 @@
Template.invitationCode.onRendered(() => {
const setting = Settings.findOne();
if (setting || setting.disableRegistration) {
$('#invitationcode').hide();
}
});
@@ -0,0 +1,90 @@
template(name="people")
.setting-content
unless currentUser.isAdmin
| {{_ 'error-notAuthorized'}}
else
.content-title
span {{_ 'people'}}
.content-body
.side-menu
ul
li.active
a.js-setting-menu(data-id="people-setting") {{_ 'people'}}
.main-body
if loading.get
+spinner
else if people.get
+peopleGeneral
template(name="peopleGeneral")
table
tbody
tr
th {{_ 'username'}}
th {{_ 'fullname'}}
th {{_ 'admin'}}
th {{_ 'email'}}
th {{_ 'verified'}}
th {{_ 'createdAt'}}
th {{_ 'active'}}
th
each user in peopleList
+peopleRow(userId=user._id)
template(name="peopleRow")
tr
td.username {{ userData.username }}
td {{ userData.profile.fullname }}
td
if userData.isAdmin
| {{_ 'yes'}}
else
| {{_ 'no'}}
td {{ userData.emails.[0].address }}
td
if userData.emails.[0].verified
| {{_ 'yes'}}
else
| {{_ 'no'}}
td {{ moment userData.createdAt 'LLL' }}
td
if userData.loginDisabled
| {{_ 'no'}}
else
| {{_ 'yes'}}
td
a.edit-user
| {{_ 'edit'}}
template(name="editUserPopup")
form
label.hide.userId(type="text" value=user._id)
label
| {{_ 'fullname'}}
input.js-profile-fullname(type="text" value=user.profile.fullname autofocus)
label
| {{_ 'username'}}
span.error.hide.username-taken
| {{_ 'error-username-taken'}}
input.js-profile-username(type="text" value=user.username)
label
| {{_ 'email'}}
span.error.hide.email-taken
| {{_ 'error-email-taken'}}
input.js-profile-email(type="email" value="{{user.emails.[0].address}}")
label
| {{_ 'admin'}}
select.select-role.js-profile-isadmin
option(value="false") {{_ 'no'}}
option(value="true" selected="{{user.isAdmin}}") {{_ 'yes'}}
label
| {{_ 'active'}}
select.select-active.js-profile-isactive
option(value="false") {{_ 'yes'}}
option(value="true" selected="{{user.loginDisabled}}") {{_ 'no'}}
hr
label
| {{_ 'password'}}
input.js-profile-password(type="password")
input.primary.wide(type="submit" value="{{_ 'save'}}")
+158
View File
@@ -0,0 +1,158 @@
const usersPerPage = 25;
BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling];
},
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
this.people = new ReactiveVar(true);
this.page = new ReactiveVar(1);
this.loadNextPageLocked = false;
this.callFirstWith(null, 'resetNextPeak');
this.autorun(() => {
const limit = this.page.get() * usersPerPage;
this.subscribe('people', limit, () => {
this.loadNextPageLocked = false;
const nextPeakBefore = this.callFirstWith(null, 'getNextPeak');
this.calculateNextPeak();
const nextPeakAfter = this.callFirstWith(null, 'getNextPeak');
if (nextPeakBefore === nextPeakAfter) {
this.callFirstWith(null, 'resetNextPeak');
}
});
});
},
loadNextPage() {
if (this.loadNextPageLocked === false) {
this.page.set(this.page.get() + 1);
this.loadNextPageLocked = true;
}
},
calculateNextPeak() {
const element = this.find('.main-body');
if (element) {
const altitude = element.scrollHeight;
this.callFirstWith(this, 'setNextPeak', altitude);
}
},
reachNextPeak() {
this.loadNextPage();
},
setError(error) {
this.error.set(error);
},
setLoading(w) {
this.loading.set(w);
},
peopleList() {
return Users.find({}, {
fields: {_id: true},
});
},
}).register('people');
Template.peopleRow.helpers({
userData() {
const userCollection = this.esSearch ? ESSearchResults : Users;
return userCollection.findOne(this.userId);
},
});
Template.editUserPopup.helpers({
user() {
return Users.findOne(this.userId);
},
});
BlazeComponent.extendComponent({
onCreated() {
},
user() {
return Users.findOne(this.userId);
},
events() {
return [{
'click a.edit-user': Popup.open('editUser'),
}];
},
}).register('peopleRow');
Template.editUserPopup.events({
submit(evt, tpl) {
evt.preventDefault();
const user = Users.findOne(this.userId);
const fullname = tpl.find('.js-profile-fullname').value.trim();
const username = tpl.find('.js-profile-username').value.trim();
const password = tpl.find('.js-profile-password').value;
const isAdmin = tpl.find('.js-profile-isadmin').value.trim();
const isActive = tpl.find('.js-profile-isactive').value.trim();
const email = tpl.find('.js-profile-email').value.trim();
const isChangePassword = password.length > 0;
const isChangeUserName = username !== user.username;
const isChangeEmail = email.toLowerCase() !== user.emails[0].address.toLowerCase();
Users.update(this.userId, {
$set: {
'profile.fullname': fullname,
'isAdmin': isAdmin === 'true',
'loginDisabled': isActive === 'true',
},
});
if(isChangePassword){
Meteor.call('setPassword', password, this.userId);
}
if (isChangeUserName && isChangeEmail) {
Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), this.userId, function (error) {
const usernameMessageElement = tpl.$('.username-taken');
const emailMessageElement = tpl.$('.email-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'username-already-taken') {
usernameMessageElement.show();
emailMessageElement.hide();
} else if (errorElement === 'email-already-taken') {
usernameMessageElement.hide();
emailMessageElement.show();
}
} else {
usernameMessageElement.hide();
emailMessageElement.hide();
Popup.close();
}
});
} else if (isChangeUserName) {
Meteor.call('setUsername', username, this.userId, function (error) {
const usernameMessageElement = tpl.$('.username-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'username-already-taken') {
usernameMessageElement.show();
}
} else {
usernameMessageElement.hide();
Popup.close();
}
});
} else if (isChangeEmail) {
Meteor.call('setEmail', email.toLowerCase(), this.userId, function (error) {
const emailMessageElement = tpl.$('.email-taken');
if (error) {
const errorElement = error.error;
if (errorElement === 'email-already-taken') {
emailMessageElement.show();
}
} else {
emailMessageElement.hide();
Popup.close();
}
});
} else Popup.close();
},
});
@@ -0,0 +1,15 @@
.main-body
overflow: scroll;
table
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
td, th
border: 1px solid #d2d0d0;
text-align: left;
padding: 8px;
tr:nth-child(even)
background-color: #dddddd;
+121
View File
@@ -0,0 +1,121 @@
template(name="setting")
.setting-content
unless currentUser.isAdmin
| {{_ 'error-notAuthorized'}}
else
.content-title
span {{_ 'settings'}}
.content-body
.side-menu
ul
li.active
a.js-setting-menu(data-id="registration-setting") {{_ 'registration'}}
li
a.js-setting-menu(data-id="email-setting") {{_ 'email'}}
li
a.js-setting-menu(data-id="account-setting") {{_ 'accounts'}}
li
a.js-setting-menu(data-id="announcement-setting") {{_ 'admin-announcement'}}
.main-body
if loading.get
+spinner
else if generalSetting.get
+general
else if emailSetting.get
+email
else if accountSetting.get
+accountSettings
else if announcementSetting.get
+announcementSettings
template(name="general")
ul#registration-setting.setting-detail
li
a.flex.js-toggle-registration
.materialCheckBox(class="{{#if currentSetting.disableRegistration}}is-checked{{/if}}")
span {{_ 'disable-self-registration'}}
li
.invite-people(class="{{#if currentSetting.disableRegistration}}{{else}}hide{{/if}}")
ul
li
.title {{_ 'invite-people'}}
textarea#email-to-invite.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='email')
ul#email-setting.setting-detail
li.smtp-form
.title {{_ 'smtp-host'}}
.description {{_ 'smtp-host-description'}}
.form-group
input.form-control#mail-server-host(type="text", placeholder="smtp.domain.com" value="{{currentSetting.mailServer.host}}")
li.smtp-form
.title {{_ 'smtp-port'}}
.description {{_ 'smtp-port-description'}}
.form-group
input.form-control#mail-server-port(type="text", placeholder="25" value="{{currentSetting.mailServer.port}}")
li.smtp-form
.title {{_ 'smtp-username'}}
.form-group
input.form-control#mail-server-username(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}")
li.smtp-form
.title {{_ 'smtp-password'}}
.form-group
input.form-control#mail-server-password(type="text", placeholder="{{_ 'password'}}" value="{{currentSetting.mailServer.password}}")
li.smtp-form
.title {{_ 'smtp-tls'}}
.form-group
a.flex.js-toggle-tls
.materialCheckBox#mail-server-tls(class="{{#if currentSetting.mailServer.enableTLS}}is-checked{{/if}}")
span {{_ 'smtp-tls-description'}}
li.smtp-form
.title {{_ 'send-from'}}
.form-group
input.form-control#mail-server-from(type="email", placeholder="no-reply@domain.com" value="{{currentSetting.mailServer.from}}")
li
button.js-save.primary {{_ 'save'}}
li
button.js-send-smtp-test-email.primary {{_ 'send-smtp-test'}}
template(name='accountSettings')
ul#account-setting.setting-detail
li.smtp-form
.title {{_ 'accounts-allowEmailChange'}}
.form-group.flex
input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="true" checked="{{#if allowEmailChange}}checked{{/if}}")
span {{_ 'yes'}}
input.form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="false" checked="{{#unless allowEmailChange}}checked{{/unless}}")
span {{_ 'no'}}
li
button.js-accounts-save.primary {{_ 'save'}}
template(name='announcementSettings')
ul#announcement-setting.setting-detail
li
a.flex.js-toggle-activemessage
.materialCheckBox(class="{{#if currentSetting.enabled}}is-checked{{/if}}")
span {{_ 'admin-announcement-active'}}
li
.admin-announcement(class="{{#if currentSetting.enabled}}{{else}}hide{{/if}}")
ul
li
.title {{_ 'admin-announcement-title'}}
textarea#admin-announcement.form-control= currentSetting.body
li
button.js-announcement-save.primary {{_ 'save'}}
+215
View File
@@ -0,0 +1,215 @@
BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
this.generalSetting = new ReactiveVar(true);
this.emailSetting = new ReactiveVar(false);
this.accountSetting = new ReactiveVar(false);
this.announcementSetting = new ReactiveVar(false);
Meteor.subscribe('setting');
Meteor.subscribe('mailServer');
Meteor.subscribe('accountSettings');
Meteor.subscribe('announcements');
},
setError(error) {
this.error.set(error);
},
setLoading(w) {
this.loading.set(w);
},
checkField(selector) {
const value = $(selector).val();
if(!value || value.trim() === ''){
$(selector).parents('li.smtp-form').addClass('has-error');
throw Error('blank field');
} else {
return value;
}
},
currentSetting(){
return Settings.findOne();
},
boards() {
return Boards.find({
archived: false,
'members.userId': Meteor.userId(),
'members.isAdmin': true,
}, {
sort: ['title'],
});
},
toggleRegistration(){
this.setLoading(true);
const registrationClosed = this.currentSetting().disableRegistration;
Settings.update(Settings.findOne()._id, {$set:{disableRegistration: !registrationClosed}});
this.setLoading(false);
if(registrationClosed){
$('.invite-people').slideUp();
}else{
$('.invite-people').slideDown();
}
},
toggleTLS(){
$('#mail-server-tls').toggleClass('is-checked');
},
switchMenu(event){
const target = $(event.target);
if(!target.hasClass('active')){
$('.side-menu li.active').removeClass('active');
target.parent().addClass('active');
const targetID = target.data('id');
this.generalSetting.set('registration-setting' === targetID);
this.emailSetting.set('email-setting' === targetID);
this.accountSetting.set('account-setting' === targetID);
this.announcementSetting.set('announcement-setting' === targetID);
}
},
checkBoard(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');
},
inviteThroughEmail(){
const emails = $('#email-to-invite').val().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) {
this.setLoading(true);
Meteor.call('sendInvitation', validEmails, boardsToInvite, () => {
// if (!err) {
// TODO - show more info to user
// }
this.setLoading(false);
});
}
},
saveMailServerInfo(){
this.setLoading(true);
$('li').removeClass('has-error');
try{
const host = this.checkField('#mail-server-host');
const port = this.checkField('#mail-server-port');
const username = $('#mail-server-username').val().trim();
const password = $('#mail-server-password').val().trim();
const from = this.checkField('#mail-server-from');
const tls = $('#mail-server-tls.is-checked').length > 0;
Settings.update(Settings.findOne()._id, {$set:{'mailServer.host':host, 'mailServer.port': port, 'mailServer.username': username,
'mailServer.password': password, 'mailServer.enableTLS': tls, 'mailServer.from': from}});
} catch (e) {
return;
} finally {
this.setLoading(false);
}
},
sendSMTPTestEmail() {
Meteor.call('sendSMTPTestEmail', (err, ret) => {
if (!err && ret) { /* eslint-disable no-console */
const message = `${TAPi18n.__(ret.message)}: ${ret.email}`;
console.log(message);
alert(message);
} else {
const reason = err.reason || '';
const message = `${TAPi18n.__(err.error)}\n${reason}`;
console.log(message, err);
alert(message);
} /* eslint-enable no-console */
});
},
events(){
return [{
'click a.js-toggle-registration': this.toggleRegistration,
'click a.js-toggle-tls': this.toggleTLS,
'click a.js-setting-menu': this.switchMenu,
'click a.js-toggle-board-choose': this.checkBoard,
'click button.js-email-invite': this.inviteThroughEmail,
'click button.js-save': this.saveMailServerInfo,
'click button.js-send-smtp-test-email': this.sendSMTPTestEmail,
}];
},
}).register('setting');
BlazeComponent.extendComponent({
saveAllowEmailChange() {
const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true');
AccountSettings.update('accounts-allowEmailChange', {
$set: { 'booleanValue': allowEmailChange },
});
},
allowEmailChange() {
return AccountSettings.findOne('accounts-allowEmailChange').booleanValue;
},
events() {
return [{
'click button.js-accounts-save': this.saveAllowEmailChange,
}];
},
}).register('accountSettings');
BlazeComponent.extendComponent({
onCreated() {
this.loading = new ReactiveVar(false);
},
setLoading(w) {
this.loading.set(w);
},
currentSetting(){
return Announcements.findOne();
},
saveMessage() {
const message = $('#admin-announcement').val().trim();
Announcements.update(Announcements.findOne()._id, {
$set: { 'body': message },
});
},
toggleActive(){
this.setLoading(true);
const isActive = this.currentSetting().enabled;
Announcements.update(Announcements.findOne()._id, {
$set:{ 'enabled': !isActive},
});
this.setLoading(false);
if(isActive){
$('.admin-announcement').slideUp();
}else{
$('.admin-announcement').slideDown();
}
},
events() {
return [{
'click a.js-toggle-activemessage': this.toggleActive,
'click button.js-announcement-save': this.saveMessage,
}];
},
}).register('announcementSettings');
+113
View File
@@ -0,0 +1,113 @@
.flex
display: -webkit-box
display: -moz-box
display: -webkit-flex
display: -moz-flex
display: -ms-flexbox
display: flex
.setting-content
padding 30px
color: #727479
background: #dedede
width 100%
height 100%
position: absolute;
.content-title
font-size 20px
.content-body
display flex
padding-top 15px
height 100%
.side-menu
background-color: #f7f7f7;
border: 1px solid #f0f0f0;
border-radius: 4px;
width: 250px;
box-shadow: inset -1px -1px 3px rgba(0,0,0,.05);
ul
li
margin: 0.1rem 0.2rem;
&.active
background #fff
box-shadow 0 1px 2px rgba(0,0,0,0.15);
&:hover
background #fff
box-shadow 0 1px 2px rgba(0,0,0,0.15);
a
@extends .flex
padding: 1rem 0 1rem 1rem
width: 100% - 5rem
span
font-size: 13px
.main-body
padding: 0.1em 1em
ul
li
padding: 0.5rem 0.5rem;
a
.is-checked
border-bottom: 2px solid #2980b9;
border-right: 2px solid #2980b9;
span
padding: 0 0.5rem
.admin-announcement,
.invite-people
padding-left 20px;
li
min-width: 500px;
ul.no-margin-bottom
margin-bottom: 0;
.bg-white
a
background #f7f7f7
&.is-checked
background #fff
.option
@extends .flex
-webkit-border-radius: 3px;
border-radius: 3px;
background: #fff;
text-decoration: none;
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2);
box-shadow: 0 1px 2px rgba(0,0,0,0.2);
margin-top: 5px;
padding: 5px;
.title
font-weight 700;
margin-bottom 0.5rem;
.description
margin-bottom 0.5rem;
.bg-white
background #f9fbfc;
.form-control.has-error
border-color: #a94442;
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
li.has-error
color #a94442
.form-group
.form-control
border-color: #a94442;
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
@@ -0,0 +1,25 @@
template(name="settingHeaderBar")
h1.header-setting-menu
span {{_ 'admin-panel'}}
.setting-header-btns.left
unless isMiniScreen
unless isSandstorm
if currentUser
a.setting-header-btn.settings(href="{{pathFor 'setting'}}")
i.fa(class="fa-cog")
span {{_ 'settings'}}
a.setting-header-btn.people(href="{{pathFor 'people'}}")
i.fa(class="fa-users")
span {{_ 'people'}}
a.setting-header-btn.informations(href="{{pathFor 'information'}}")
i.fa(class="fa-info-circle")
span {{_ 'info'}}
else
a.setting-header-btn.js-log-in(
title="{{_ 'log-in'}}")
i.fa.fa-sign-in
span {{_ 'log-in'}}
@@ -0,0 +1,25 @@
#header #header-main-bar .setting-header-btn
&.active,
&:hover:not(.is-disabled)
background: rgba(0, 0, 0, .15)
color: darken(white, 5%)
margin-left: 20px;
padding-right: 10px;
height: 28px;
font-size: 13px;
float: left;
overflow: hidden;
line-height: @height;
margin: 0 2px;
i.fa
float: left
display: block
line-height: 28px
color: darken(white, 5%)
margin: 0 10px
+ span
display: inline-block
margin-top: 1px
margin-right: 10px
+79 -44
View File
@@ -1,14 +1,22 @@
template(name="sidebar")
.board-sidebar.sidebar(class="{{#if isOpen}}is-open{{/if}}")
a.sidebar-tongue.js-toggle-sidebar(
class="{{#if isTongueHidden}}is-hidden{{/if}}")
class="{{#if isTongueHidden}}is-hidden{{/if}}",
title="{{showTongueTitle}}")
i.fa.fa-angle-left
.sidebar-content.js-board-sidebar-content.js-perfect-scrollbar
unless isDefaultView
h2
a.fa.fa-chevron-left.js-back-home
= getViewTitle
+Template.dynamic(template=getViewTemplate)
.sidebar-shadow
.sidebar-content.sidebar-shortcuts
a.board-header-btn.js-shortcuts
i.fa.fa-keyboard-o
span {{_ 'keyboard-shortcuts' }}
.sidebar-content.js-board-sidebar-content.js-perfect-scrollbar
a.hide-btn.js-hide-sidebar
i.fa.fa-angle-right
unless isDefaultView
h2
a.fa.fa-chevron-left.js-back-home
= getViewTitle
+Template.dynamic(template=getViewTemplate)
template(name='homeSidebar')
+membersWidget
@@ -28,11 +36,21 @@ template(name="membersWidget")
.board-widget-content
each currentBoard.activeMembers
+userAvatar(userId=this.userId showStatus=true)
unless isSandstorm
if currentUser.isBoardAdmin
a.member.add-member.js-manage-board-members
if isSandstorm
if currentUser.isBoardMember
a.member.add-member.sandstorm-powerbox-request-identity
i.fa.fa-plus
else if currentUser.isBoardAdmin
a.member.add-member.js-manage-board-members
i.fa.fa-plus
.clearfix
if isInvited
hr
p
i.fa.fa-exclamation-circle
| {{_ 'just-invited'}}
button.js-member-invite-accept.primary {{_ 'accept'}}
button.js-member-invite-decline {{_ 'decline'}}
template(name="labelsWidget")
.board-widget.board-widget-labels
@@ -42,7 +60,7 @@ template(name="labelsWidget")
.board-widget-content
each currentBoard.labels
a.card-label(class="card-label-{{color}}"
class="{{#if currentUser.isBoardMember}}js-label{{/if}}")
class="{{#if currentUser.isNotCommentOnly}}js-label{{/if}}")
span.card-label-name= name
if currentUser.isBoardAdmin
a.card-label.add-label.js-add-label
@@ -56,51 +74,62 @@ template(name="memberPopup")
h3
.js-profile= user.profile.fullname
p.quiet @#{user.username}
if isInvited
p
i.fa.fa-exclamation-circle
| {{_ 'not-accepted-yet'}}
if currentUser.isBoardMember
ul.pop-over-list
ul.pop-over-list
li
a.js-filter-member {{_ 'filter-cards'}}
unless isSandstorm
if currentUser.isBoardAdmin
li
a.js-change-role
| {{_ 'change-permissions'}}
span.quiet (#{memberType})
li
a.js-filter-member Filter cards
unless isSandstorm
if currentUser.isBoardAdmin
li
a.js-change-role
| {{_ 'change-permissions'}}
span.quiet (#{memberType})
li
if $eq currentUser._id userId
//-
XXX Not implemented!
// a.js-leave-member {{_ 'leave-board'}}
else
a.js-remove-member {{_ 'remove-from-board'}}
if $eq currentUser._id userId
a.js-leave-member {{_ 'leave-board'}}
else if currentUser.isBoardAdmin
a.js-remove-member {{_ 'remove-from-board'}}
template(name="removeMemberPopup")
p {{_ 'remove-member-pop' name=user.profile.name username=user.username boardTitle=board.title}}
p {{_ 'remove-member-pop' name=user.profile.fullname username=user.username boardTitle=board.title}}
button.js-confirm.negate.full(type="submit") {{_ 'remove-member'}}
template(name="leaveBoardPopup")
p {{_ 'leave-board-pop' boardTitle=board.title}}
button.js-confirm.negate.full(type="submit") {{_ 'leave-board'}}
template(name="addMemberPopup")
.js-search-member
+esInput(index="users")
ul.pop-over-list
+esEach(index="users")
li.item.js-member-item(class="{{#if isBoardMember}}disabled{{/if}}")
a.name.js-select-member(title="{{profile.name}} ({{username}})")
+userAvatar(userId=_id esSearch=true)
span.full-name
= profile.name
| (<span class="username">{{username}}</span>)
if isBoardMember
.quiet ({{_ 'joined'}})
if loading.get
+spinner
else if error.get
.warning {{_ error.get}}
else
ul.pop-over-list
+esEach(index="users")
li.item.js-member-item(class="{{#if isBoardMember}}disabled{{/if}}")
a.name.js-select-member(title="{{profile.fullname}} ({{username}})")
+userAvatar(userId=_id esSearch=true)
span.full-name
= profile.fullname
| (<span class="username">{{username}}</span>)
if isBoardMember
.quiet ({{_ 'joined'}})
+ifEsIsSearching(index='users')
+spinner
+ifEsIsSearching(index='users')
+spinner
+ifEsHasNoResults(index="users")
.manage-member-section
p.quiet {{_ 'no-results'}}
+ifEsHasNoResults(index="users")
.manage-member-section
p.quiet {{_ 'no-results'}}
button.js-email-invite.primary.full {{_ 'email-invite'}}
template(name="changePermissionsPopup")
ul.pop-over-list
@@ -113,9 +142,15 @@ template(name="changePermissionsPopup")
li
a(class="{{#if isLastAdmin}}disabled{{else}}js-set-normal{{/if}}")
| {{_ 'normal'}}
unless isAdmin
if isNormal
i.fa.fa-check
span.sub-name {{_ 'normal-desc'}}
li
a(class="{{#if isLastAdmin}}disabled{{else}}js-set-comment-only{{/if}}")
| {{_ 'comment-only'}}
if isCommentOnly
i.fa.fa-check
span.sub-name {{_ 'comment-only-desc'}}
if isLastAdmin
hr
p.quiet.bottom {{_ 'last-admin-desc'}}
+167 -80
View File
@@ -4,21 +4,19 @@ const defaultView = 'home';
const viewTitles = {
filter: 'filter-cards',
search: 'search-cards',
multiselection: 'multi-selection',
archives: 'archives',
};
BlazeComponent.extendComponent({
template() {
return 'sidebar';
},
mixins() {
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
},
onCreated() {
this._isOpen = new ReactiveVar(!Session.get('currentCard'));
const initOpen = Utils.isMiniScreen() ? false : (!Session.get('currentCard'));
this._isOpen = new ReactiveVar(initOpen);
this._view = new ReactiveVar(defaultView);
Sidebar = this;
},
@@ -54,7 +52,7 @@ BlazeComponent.extendComponent({
},
reachNextPeak() {
const activitiesComponent = this.componentChildren('activities')[0];
const activitiesComponent = this.childComponents('activities')[0];
activitiesComponent.loadNextPage();
},
@@ -92,13 +90,22 @@ BlazeComponent.extendComponent({
return TAPi18n.__(viewTitles[this.getView()]);
},
showTongueTitle() {
if (this.isOpen())
return `${TAPi18n.__('sidebar-close')}`;
else
return `${TAPi18n.__('sidebar-open')}`;
},
events() {
// XXX Hacky, we need some kind of `super`
const mixinEvents = this.getMixin(Mixins.InfiniteScrolling).events();
return mixinEvents.concat([{
return [{
'click .js-hide-sidebar': this.hide,
'click .js-toggle-sidebar': this.toggle,
'click .js-back-home': this.setView,
}]);
'click .js-shortcuts'() {
FlowRouter.go('shortcuts');
},
}];
},
}).register('sidebar');
@@ -109,21 +116,26 @@ EscapeActions.register('sidebarView',
() => { return Sidebar && Sidebar.getView() !== defaultView; }
);
function getMemberIndex(board, searchId) {
for (let i = 0; i < board.members.length; i++) {
if (board.members[i].userId === searchId)
return i;
}
throw new Meteor.Error('Member not found');
}
Template.memberPopup.helpers({
user() {
return Users.findOne(this.userId);
},
memberType() {
const type = Users.findOne(this.userId).isBoardAdmin() ? 'admin' : 'normal';
return TAPi18n.__(type).toLowerCase();
if(type === 'normal'){
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const commentOnly = currentBoard.hasCommentOnly(this.userId);
if(commentOnly){
return TAPi18n.__('comment-only').toLowerCase();
} else {
return TAPi18n.__(type).toLowerCase();
}
} else {
return TAPi18n.__(type).toLowerCase();
}
},
isInvited() {
return Users.findOne(this.userId).isInvitedTo(Session.get('currentBoard'));
},
});
@@ -134,25 +146,64 @@ Template.memberPopup.events({
},
'click .js-change-role': Popup.open('changePermissions'),
'click .js-remove-member': Popup.afterConfirm('removeMember', function() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const memberIndex = getMemberIndex(currentBoard, this.userId);
Boards.update(currentBoard._id, {
$set: {
[`members.${memberIndex}.isActive`]: false,
},
const boardId = Session.get('currentBoard');
const memberId = this.userId;
Cards.find({ boardId, members: memberId }).forEach((card) => {
card.unassignMember(memberId);
});
Boards.findOne(boardId).removeMember(memberId);
Popup.close();
}),
'click .js-leave-member'() {
// XXX Not implemented
Popup.close();
'click .js-leave-member': Popup.afterConfirm('leaveBoard', () => {
const boardId = Session.get('currentBoard');
Meteor.call('quitBoard', boardId, () => {
Popup.close();
FlowRouter.go('home');
});
}),
});
Template.removeMemberPopup.helpers({
user() {
return Users.findOne(this.userId);
},
board() {
return Boards.findOne(Session.get('currentBoard'));
},
});
Template.leaveBoardPopup.helpers({
board() {
return Boards.findOne(Session.get('currentBoard'));
},
});
Template.membersWidget.helpers({
isInvited() {
const user = Meteor.user();
return user && user.isInvitedTo(Session.get('currentBoard'));
},
});
Template.membersWidget.events({
'click .js-member': Popup.open('member'),
'click .js-manage-board-members': Popup.open('addMember'),
'click .sandstorm-powerbox-request-identity'() {
window.sandstormRequestIdentity();
},
'click .js-member-invite-accept'() {
const boardId = Session.get('currentBoard');
Meteor.user().removeInvite(boardId);
},
'click .js-member-invite-decline'() {
const boardId = Session.get('currentBoard');
Meteor.call('quitBoard', boardId, (err, ret) => {
if (!err && ret) {
Meteor.user().removeInvite(boardId);
FlowRouter.go('home');
}
});
},
});
Template.labelsWidget.events({
@@ -166,9 +217,6 @@ Template.labelsWidget.events({
// autorun function and register a dependency on the both members and labels
// fields of the current board document.
function draggableMembersLabelsWidgets() {
if (!Meteor.user() || !Meteor.user().isBoardMember())
return;
this.autorun(() => {
const currentBoardId = Tracker.nonreactive(() => {
return Session.get('currentBoard');
@@ -180,7 +228,8 @@ function draggableMembersLabelsWidgets() {
},
});
Tracker.afterFlush(() => {
this.$('.js-member,.js-label').draggable({
const $draggables = this.$('.js-member,.js-label');
$draggables.draggable({
appendTo: 'body',
helper: 'clone',
revert: 'invalid',
@@ -191,6 +240,14 @@ function draggableMembersLabelsWidgets() {
EscapeActions.executeUpTo('popup-back');
},
});
function userIsMember() {
return Meteor.user() && Meteor.user().isBoardMember();
}
this.autorun(() => {
$draggables.draggable('option', 'disabled', !userIsMember());
});
});
});
}
@@ -198,72 +255,102 @@ function draggableMembersLabelsWidgets() {
Template.membersWidget.onRendered(draggableMembersLabelsWidgets);
Template.labelsWidget.onRendered(draggableMembersLabelsWidgets);
Template.addMemberPopup.helpers({
BlazeComponent.extendComponent({
onCreated() {
this.error = new ReactiveVar('');
this.loading = new ReactiveVar(false);
},
onRendered() {
this.find('.js-search-member input').focus();
this.setLoading(false);
},
isBoardMember() {
const user = Users.findOne(this._id);
const userId = this.currentData()._id;
const user = Users.findOne(userId);
return user && user.isBoardMember();
},
});
Template.addMemberPopup.events({
'click .js-select-member'() {
const userId = this._id;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const currentMembersIds = _.pluck(currentBoard.members, 'userId');
if (currentMembersIds.indexOf(userId) === -1) {
Boards.update(currentBoard._id, {
$push: {
members: {
userId,
isAdmin: false,
isActive: true,
},
},
});
} else {
const memberIndex = getMemberIndex(currentBoard, userId);
Boards.update(currentBoard._id, {
$set: {
[`members.${memberIndex}.isActive`]: true,
},
});
}
Popup.close();
isValidEmail(email) {
return SimpleSchema.RegEx.Email.test(email);
},
});
Template.addMemberPopup.onRendered(function() {
this.find('.js-search-member input').focus();
});
setError(error) {
this.error.set(error);
},
setLoading(w) {
this.loading.set(w);
},
isLoading() {
return this.loading.get();
},
inviteUser(idNameEmail) {
const boardId = Session.get('currentBoard');
this.setLoading(true);
const self = this;
Meteor.call('inviteUserToBoard', idNameEmail, boardId, (err, ret) => {
self.setLoading(false);
if (err) self.setError(err.error);
else if (ret.email) self.setError('email-sent');
else Popup.close();
});
},
events() {
return [{
'keyup input'() {
this.setError('');
},
'click .js-select-member'() {
const userId = this.currentData()._id;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
if (!currentBoard.hasMember(userId)) {
this.inviteUser(userId);
}
},
'click .js-email-invite'() {
const idNameEmail = $('.js-search-member input').val();
if (idNameEmail.indexOf('@')<0 || this.isValidEmail(idNameEmail)) {
this.inviteUser(idNameEmail);
} else this.setError('email-invalid');
},
}];
},
}).register('addMemberPopup');
Template.changePermissionsPopup.events({
'click .js-set-admin, click .js-set-normal'(event) {
'click .js-set-admin, click .js-set-normal, click .js-set-comment-only'(event) {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const memberIndex = getMemberIndex(currentBoard, this.userId);
const memberId = this.userId;
const isAdmin = $(event.currentTarget).hasClass('js-set-admin');
Boards.update(currentBoard._id, {
$set: {
[`members.${memberIndex}.isAdmin`]: isAdmin,
},
});
const isCommentOnly = $(event.currentTarget).hasClass('js-set-comment-only');
currentBoard.setMemberPermission(memberId, isAdmin, isCommentOnly);
Popup.back(1);
},
});
Template.changePermissionsPopup.helpers({
isAdmin() {
const user = Users.findOne(this.userId);
return user.isBoardAdmin();
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return currentBoard.hasAdmin(this.userId);
},
isNormal() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return !currentBoard.hasAdmin(this.userId) && !currentBoard.hasCommentOnly(this.userId);
},
isCommentOnly() {
const currentBoard = Boards.findOne(Session.get('currentBoard'));
return !currentBoard.hasAdmin(this.userId) && currentBoard.hasCommentOnly(this.userId);
},
isLastAdmin() {
const user = Users.findOne(this.userId);
if (!user.isBoardAdmin())
return false;
const currentBoard = Boards.findOne(Session.get('currentBoard'));
const nbAdmins = _.where(currentBoard.members, { isAdmin: true }).length;
return nbAdmins === 1;
return currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1);
},
});
Loaded 100 of 266 files, more files were not shown because too many files have changed in this diff. Show more