mirror of
https://github.com/wekan/wekan.git
synced 2026-11-08 11:25:19 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
975993dd6d | ||
|
|
43084eb664 | ||
|
|
0e770ac3b3 | ||
|
|
206abc8c68 | ||
|
|
62b13cc343 | ||
|
|
7822dd3b75 | ||
|
|
a214cd64b6 | ||
|
|
8839a8ea39 | ||
|
|
a4169f3da7 | ||
|
|
19d59b3ab4 | ||
|
|
27b2e2384c | ||
|
|
49d2cbc2c1 | ||
|
|
bf2b3b40cd | ||
|
|
1541c6ca23 | ||
|
|
42c1ff94e2 | ||
|
|
53aa5ebc17 | ||
|
|
0f43818757 | ||
|
|
f3c5b1eb07 | ||
|
|
517d1bb7fa | ||
|
|
6ee0919ead | ||
|
|
13eb1a58e0 | ||
|
|
08f9c09484 | ||
|
|
3f3abe26ee | ||
|
|
e31c5b6d42 | ||
|
|
7bf77fa7cb | ||
|
|
a2662f1366 | ||
|
|
116cf6aa21 | ||
|
|
79bb6d0c55 | ||
|
|
c157ecec38 | ||
|
|
28893cf637 | ||
|
|
73ffc99f37 | ||
|
|
35802c7c62 | ||
|
|
bc44fdf89c | ||
|
|
030c3dd587 | ||
|
|
498be2759e | ||
|
|
649d00733a | ||
|
|
8a7a4f3033 | ||
|
|
b6ce81dc79 | ||
|
|
490c417cee | ||
|
|
2dfeb3924b | ||
|
|
bff96f6ae2 | ||
|
|
4801e26b2f | ||
|
|
027997f7b3 | ||
|
|
76aaefbde1 | ||
|
|
a01bc0f325 | ||
|
|
f6f4f5660e | ||
|
|
956925889a | ||
|
|
0bd49326d8 | ||
|
|
64c4e8eca8 | ||
|
|
55fc342f6d | ||
|
|
3ae0d96760 | ||
|
|
fc1e55cc19 | ||
|
|
58fc810a43 | ||
|
|
3c477e9783 | ||
|
|
f2247ed86d | ||
|
|
0d9a9d1ed8 | ||
|
|
ca5a579e22 | ||
|
|
53d97a593f | ||
|
|
3641a8f389 | ||
|
|
1dea1bd09d | ||
|
|
3db265d57f | ||
|
|
38a32824ea | ||
|
|
b0c94f7ff2 | ||
|
|
2415aa3d2b | ||
|
|
1af1844f37 | ||
|
|
75bb247c2b | ||
|
|
5a1b517733 | ||
|
|
0fbc8754f7 | ||
|
|
aaca60b676 | ||
|
|
a929d1e3a4 | ||
|
|
4a7fa7c396 | ||
|
|
45674806d7 | ||
|
|
8905bc7dfe | ||
|
|
dd6aec1ba9 | ||
|
|
aca5fa4d0a | ||
|
|
0d1f45b8a2 | ||
|
|
3f9ae57144 | ||
|
|
45c2f1007b | ||
|
|
83adaa3074 | ||
|
|
1951b279c0 | ||
|
|
50406ad683 | ||
|
|
95740eaa01 | ||
|
|
08f2c1c735 | ||
|
|
32459ec405 | ||
|
|
c7ac0cbce1 | ||
|
|
711fb5754e | ||
|
|
24fffd8bfa | ||
|
|
52556aff68 | ||
|
|
c76959ff25 | ||
|
|
a141871e60 | ||
|
|
5e639a7c2d | ||
|
|
f9654d17d5 | ||
|
|
c89f3ba3da | ||
|
|
1dc5ae444e | ||
|
|
5db67e47a8 | ||
|
|
3877e5feb9 | ||
|
|
7456186265 | ||
|
|
952f7feb49 | ||
|
|
3983d750f3 | ||
|
|
b4f2a8ab5b | ||
|
|
e8a4554789 | ||
|
|
de3bc9cb4d | ||
|
|
e09f028cd1 | ||
|
|
ea9f597685 | ||
|
|
e538fb9514 | ||
|
|
32fed3d048 | ||
|
|
c6b6d1aa40 | ||
|
|
b9615ccbad | ||
|
|
0032a91f66 | ||
|
|
88f6076422 | ||
|
|
8e11ecf799 | ||
|
|
d04c5c9846 | ||
|
|
e46a66904f | ||
|
|
d038cb4a2d | ||
|
|
78e68c7fea | ||
|
|
700f345576 | ||
|
|
22067198ab | ||
|
|
21d6dfd790 | ||
|
|
e663ce038a | ||
|
|
367b7778fd | ||
|
|
989e0a5326 | ||
|
|
13940f0663 | ||
|
|
09e87f207c | ||
|
|
f9884b7782 | ||
|
|
cca5f81c65 | ||
|
|
c863428aa2 | ||
|
|
2104b853ef | ||
|
|
00a56f6aaa | ||
|
|
67e7a75b9c | ||
|
|
52375df783 | ||
|
|
77fad0e7c6 | ||
|
|
802341384e | ||
|
|
057ac4031e | ||
|
|
ea5d0999c4 | ||
|
|
7b21650003 | ||
|
|
1cfaddff9c | ||
|
|
7690d91771 | ||
|
|
6b7b66801b | ||
|
|
d671071758 | ||
|
|
e9c1c620eb | ||
|
|
b17a8757fb | ||
|
|
2b04cef50b | ||
|
|
16060108b4 | ||
|
|
0fb2f7fdd6 | ||
|
|
c002cf759e | ||
|
|
5fee0b05e0 | ||
|
|
48bc176bdf | ||
|
|
ec56dc73c4 | ||
|
|
83e9d681d7 | ||
|
|
e0b9e80698 | ||
|
|
449c02c42a | ||
|
|
ce89ff4833 | ||
|
|
1961e22cbd | ||
|
|
b95ee7cf4d | ||
|
|
14b2291590 | ||
|
|
954ec05d41 | ||
|
|
4c25b40b2d | ||
|
|
1792e3d884 | ||
|
|
3c35a6400b | ||
|
|
2a4ba31a9e | ||
|
|
99a8afd6c3 | ||
|
|
cc9ff4c8db | ||
|
|
ed4189cc5e | ||
|
|
6d66e60830 | ||
|
|
930f0a7f82 | ||
|
|
89347e2a56 | ||
|
|
09a08cd074 | ||
|
|
c344474d9e | ||
|
|
d13d169768 | ||
|
|
e3929973d1 | ||
|
|
9b428150a4 | ||
|
|
8ba565042f | ||
|
|
6df03294bd | ||
|
|
4a40ac3ced | ||
|
|
2f34d65164 | ||
|
|
7c68d6a710 | ||
|
|
55fb7a8f27 | ||
|
|
bb9fb1187e | ||
|
|
f0170c576c | ||
|
|
02caaafc52 | ||
|
|
168b17ac4e | ||
|
|
e3214c874e | ||
|
|
91444cce9b | ||
|
|
c952aaadec | ||
|
|
77ab5c1690 | ||
|
|
37857935f3 | ||
|
|
e5c7650fc8 | ||
|
|
f42e0fe507 | ||
|
|
58dbd78997 | ||
|
|
04b995e77f | ||
|
|
82aa3fb7ee | ||
|
|
ec0e88ad2e | ||
|
|
cac28fde4d | ||
|
|
e65a8c9017 | ||
|
|
4a26f80fb1 | ||
|
|
bca8a72a0f | ||
|
|
13be8160d5 | ||
|
|
8efea6c4e2 | ||
|
|
36bb5e099e | ||
|
|
b86a24d97a | ||
|
|
3febe80329 | ||
|
|
b11a2103a4 | ||
|
|
4a9d881e47 | ||
|
|
8e5c6af612 | ||
|
|
ca588a4b54 | ||
|
|
258032acb0 | ||
|
|
2c9c9c4356 | ||
|
|
88d4e8a4d9 | ||
|
|
4e2a8735bc | ||
|
|
b72d24f6d0 | ||
|
|
1f2fb2ccce | ||
|
|
5e2b423ef8 | ||
|
|
79e2001708 | ||
|
|
2ea96518ad | ||
|
|
2666001226 | ||
|
|
1bd30bc121 | ||
|
|
d6d8144476 | ||
|
|
68e7818c1d | ||
|
|
e0e5f4514b | ||
|
|
c2942fa269 | ||
|
|
6f31240c74 | ||
|
|
5124265142 | ||
|
|
f0bd5eaca9 | ||
|
|
8589f85907 | ||
|
|
66d739b3b1 | ||
|
|
2206e34ab6 | ||
|
|
cc1ca4a1bb | ||
|
|
c8b1ef8ea6 | ||
|
|
f836faad48 | ||
|
|
7e27b916aa | ||
|
|
ae9963c1f7 | ||
|
|
2b4f4c8d4d | ||
|
|
68104fe578 | ||
|
|
6f2c46a747 | ||
|
|
e7e1f1b667 | ||
|
|
7dc20616a7 | ||
|
|
b5b323000a | ||
|
|
19d204c7a8 | ||
|
|
672c279b0a | ||
|
|
669e31ea64 | ||
|
|
4ab72170e3 | ||
|
|
9ca39696b3 | ||
|
|
7c36279308 | ||
|
|
89e5b3a979 | ||
|
|
58782c9a89 | ||
|
|
c3824dcbd2 | ||
|
|
cead2bc00f | ||
|
|
0d5380466a | ||
|
|
58f6acbc48 | ||
|
|
db73fb4e37 | ||
|
|
a3d4c3d948 | ||
|
|
f9dc5c6f80 | ||
|
|
96b763fb89 | ||
|
|
98a75305e7 | ||
|
|
0d8739327e | ||
|
|
7dc4d9bb71 | ||
|
|
c814221185 | ||
|
|
f2f6b57944 | ||
|
|
f50c2af914 | ||
|
|
5b7442436d | ||
|
|
9cebee7347 | ||
|
|
f311359373 | ||
|
|
31b9970c04 | ||
|
|
baf0edc51e | ||
|
|
69a2a76b2e | ||
|
|
7fd894f33d | ||
|
|
3f366844e2 | ||
|
|
4156b6f932 | ||
|
|
ed801f7082 | ||
|
|
cedd10e067 | ||
|
|
86b756b6bc | ||
|
|
259a12acf9 | ||
|
|
902f86d363 | ||
|
|
d5fc75e345 | ||
|
|
5650bd829a | ||
|
|
f9ad46180e | ||
|
|
6e534d7543 | ||
|
|
9aa56a8e42 | ||
|
|
4ed67832d2 | ||
|
|
3409de9ed1 | ||
|
|
e73a44d15b | ||
|
|
5cf30f05fd | ||
|
|
63117e87e7 | ||
|
|
a8e520e7f0 | ||
|
|
e14bb16d60 | ||
|
|
b704d58f0f | ||
|
|
246e9a7764 | ||
|
|
1c7b63f583 | ||
|
|
e6476319bc | ||
|
|
c954934b33 | ||
|
|
a72a6886f6 | ||
|
|
a601ba542a | ||
|
|
f22f470ba4 | ||
|
|
3faeeac126 | ||
|
|
40be1d416b | ||
|
|
9ef82458b7 | ||
|
|
da99e363cd | ||
|
|
3110bb48fd | ||
|
|
08e2f2f273 | ||
|
|
6636d12215 | ||
|
|
5f243d173a | ||
|
|
5ea8d3a4c6 | ||
|
|
dad3fd22ec | ||
|
|
f381402e8f | ||
|
|
f010235ff2 | ||
|
|
09f6dcbde1 | ||
|
|
224b8e3492 | ||
|
|
28612bbc8a | ||
|
|
dfe4f7bb56 | ||
|
|
3f28c0dd22 | ||
|
|
959dd1a95a | ||
|
|
d5297cd1df | ||
|
|
95404f43b7 | ||
|
|
9838af5e56 | ||
|
|
dab656f8ca | ||
|
|
802eeb1e6b | ||
|
|
98dd28818a | ||
|
|
f705373cc4 | ||
|
|
5bc60a8dab | ||
|
|
1c8f783767 | ||
|
|
24d3075c85 | ||
|
|
c461adff11 | ||
|
|
b172f7207d | ||
|
|
ef31fffa40 | ||
|
|
426632a307 | ||
|
|
2c708b6df6 | ||
|
|
b555d0ccc8 | ||
|
|
e1724c8a12 | ||
|
|
cd35574c0b | ||
|
|
d016cbcffc | ||
|
|
7e4b672888 | ||
|
|
06d9abf6f6 | ||
|
|
a1a6dae5c6 | ||
|
|
c5f40f1be9 | ||
|
|
4358cb5e57 | ||
|
|
a591bf05e0 | ||
|
|
568b7538ad | ||
|
|
bbd7765432 | ||
|
|
558024785f | ||
|
|
76043cc5b6 | ||
|
|
583fca1814 | ||
|
|
806201b8cb | ||
|
|
24c89aeb64 | ||
|
|
8f0d88d9e0 | ||
|
|
e92d8dc127 | ||
|
|
8a99e8f796 | ||
|
|
c0246c6834 | ||
|
|
42ed92f346 | ||
|
|
df0bd90fae | ||
|
|
3453f94b43 | ||
|
|
ca537e266d | ||
|
|
8f3c948614 | ||
|
|
059743ad34 | ||
|
|
33ccf68e17 | ||
|
|
b6f22712f9 | ||
|
|
9e413b3961 | ||
|
|
5dd318a481 | ||
|
|
1783257c0e | ||
|
|
966852c212 | ||
|
|
07d6c1e514 | ||
|
|
09be915ea5 | ||
|
|
abd3c95dfa | ||
|
|
3fa61ac23c | ||
|
|
00bbc26698 | ||
|
|
3004f54b5d | ||
|
|
ef5b888779 | ||
|
|
835e33bf09 | ||
|
|
8ba3a05648 | ||
|
|
73ae73d4c3 | ||
|
|
76175a711a | ||
|
|
574acd6744 | ||
|
|
9e0e052bba | ||
|
|
ffafb30b9b | ||
|
|
9c4e402e6c | ||
|
|
f6f9dbb5e3 | ||
|
|
7beced1e68 | ||
|
|
c8921b77f0 | ||
|
|
482ce0a265 | ||
|
|
c570405d02 | ||
|
|
35ed465e10 | ||
|
|
747bc4c088 | ||
|
|
7c156927e4 | ||
|
|
13f0c77fb6 | ||
|
|
82d9f77eb3 | ||
|
|
151699ceb9 | ||
|
|
cc5d5bdd01 | ||
|
|
f43dadc068 | ||
|
|
b24694bea3 | ||
|
|
f4b31aa771 | ||
|
|
3cd5d00b0b | ||
|
|
7112584139 | ||
|
|
639b9c8f56 | ||
|
|
791ebc6406 | ||
|
|
059134d3d0 | ||
|
|
3b0616c150 | ||
|
|
ad5c4fdca2 | ||
|
|
b219b8fb65 | ||
|
|
73a170a388 | ||
|
|
e55e9c73b9 | ||
|
|
71ed5d3427 | ||
|
|
8b7bdfe0c7 | ||
|
|
ed6018fad1 | ||
|
|
b5f4be36d4 | ||
|
|
5c0a46b006 | ||
|
|
54ed46447a | ||
|
|
84fe3c2f40 | ||
|
|
e30329a18c | ||
|
|
22b40aab5d | ||
|
|
c3c8b1eb70 | ||
|
|
ce82ee8d0d | ||
|
|
04f0967b18 | ||
|
|
f8ef2e33de | ||
|
|
20a8ac7c98 | ||
|
|
37e9236bde | ||
|
|
fc11ff13c5 | ||
|
|
c92586ee64 | ||
|
|
38e2308d94 | ||
|
|
03044250a3 | ||
|
|
ebe7ec40e4 | ||
|
|
412626052b | ||
|
|
2a0af154c6 | ||
|
|
87debbd26b | ||
|
|
10e88fccd6 | ||
|
|
cc781c0082 | ||
|
|
5198ee997c | ||
|
|
4843d6cdc1 | ||
|
|
8ca0b2d9c3 | ||
|
|
cf589cb792 | ||
|
|
eda05e0157 | ||
|
|
4ae8a0308e | ||
|
|
88c6ce1c7e | ||
|
|
b714e2fca0 | ||
|
|
ce3a931c59 | ||
|
|
69f5d90e91 | ||
|
|
1a6ab68752 | ||
|
|
f13001e53a | ||
|
|
824b537db0 | ||
|
|
42e4bc3105 | ||
|
|
ebcedcffec | ||
|
|
b8cc84261f | ||
|
|
4e2475502a | ||
|
|
7dd9bcce2b | ||
|
|
620628dca3 | ||
|
|
5ee7d52e8c | ||
|
|
26004b1f73 | ||
|
|
59c42bc1a3 | ||
|
|
c8a7d539f3 | ||
|
|
98c86bcc0f | ||
|
|
1b138e14c3 | ||
|
|
a54e52d34b | ||
|
|
67218fb61d | ||
|
|
4eb0085243 | ||
|
|
38a8fcb69a | ||
|
|
64592d734c | ||
|
|
abddc8a864 | ||
|
|
09b45aca4f | ||
|
|
f624211620 | ||
|
|
c19cde53d6 | ||
|
|
cf8694fcd1 | ||
|
|
28d640afb4 | ||
|
|
7b432078a0 | ||
|
|
19703fed31 | ||
|
|
b01e127cc3 | ||
|
|
f0c2d81352 | ||
|
|
67896adefc | ||
|
|
d1b29b6e61 | ||
|
|
ef93aad659 | ||
|
|
616b433409 | ||
|
|
515d96eef0 | ||
|
|
85963cc58d | ||
|
|
e15611a0ea | ||
|
|
f89a2ab91d | ||
|
|
18d3fb75ac | ||
|
|
f5bc2b08f9 | ||
|
|
80e5916394 | ||
|
|
48c47f9911 | ||
|
|
c3f5849f11 | ||
|
|
c73346eda0 | ||
|
|
d976455a12 | ||
|
|
f10f80f655 | ||
|
|
b680d03da2 | ||
|
|
9590fec3fc | ||
|
|
e9fc5537e4 | ||
|
|
8ae47cb2f8 | ||
|
|
2fefaf1b5b | ||
|
|
5554cd7567 | ||
|
|
442ea7595a | ||
|
|
0e6d83c085 | ||
|
|
3199da4b3d | ||
|
|
23c2a2bc22 | ||
|
|
554bec4f1e | ||
|
|
4d6e6a85e0 | ||
|
|
fe887b7b5e | ||
|
|
d954b97aac | ||
|
|
374e673107 | ||
|
|
68c0d3fbe5 | ||
|
|
335f0451e0 | ||
|
|
b5a071f51e | ||
|
|
805458a763 | ||
|
|
4f8e711a5f | ||
|
|
06397e9e11 | ||
|
|
94be762f68 | ||
|
|
ccb48d0711 | ||
|
|
b6014ca992 | ||
|
|
02c5f2e3cf | ||
|
|
84a228fc1a | ||
|
|
356fddc182 | ||
|
|
c4853b9aa7 | ||
|
|
d6cb460186 | ||
|
|
a0f9b81113 | ||
|
|
15b9497a72 | ||
|
|
93be112a94 | ||
|
|
5a9a5df448 | ||
|
|
75383fe477 | ||
|
|
3f0109e810 | ||
|
|
c21db857fb | ||
|
|
e3a0a480ed | ||
|
|
3917d8c4a3 | ||
|
|
6a3b8a668b | ||
|
|
edfa9783c3 | ||
|
|
b4c9c1df9a | ||
|
|
85353d9f90 | ||
|
|
905f0316b6 | ||
|
|
b3961609e1 | ||
|
|
8ad4a1aa96 | ||
|
|
3fd1f4f5ec | ||
|
|
31ca78c17b | ||
|
|
a628c0fc03 | ||
|
|
3cc10c77f9 | ||
|
|
a727f8a62c | ||
|
|
f324286911 | ||
|
|
7f7d06be65 | ||
|
|
c9f1278651 | ||
|
|
dd69966def | ||
|
|
2f2a039e3c | ||
|
|
80db4cd645 | ||
|
|
ed9338608e | ||
|
|
fef0c0e490 | ||
|
|
e0e703dc72 | ||
|
|
8aca32179e | ||
|
|
ab823795cf | ||
|
|
d90ab03bbe | ||
|
|
bf053e0018 | ||
|
|
46c911bb2a | ||
|
|
2bc8df9188 | ||
|
|
6367b18f4f | ||
|
|
a307bfa1ec | ||
|
|
cfb3caf504 | ||
|
|
daf524238b | ||
|
|
5435604448 | ||
|
|
64500f1f73 | ||
|
|
d5ee0b567a | ||
|
|
5ec4988efe | ||
|
|
e41072dcdf | ||
|
|
126ddda45d | ||
|
|
bec460f77e | ||
|
|
fd56d4c63c | ||
|
|
d9cefb84b8 | ||
|
|
3013114c1f | ||
|
|
095dfdb24f | ||
|
|
a032586aaf | ||
|
|
d16c141821 | ||
|
|
dcf75f0bcd | ||
|
|
282a9e3097 | ||
|
|
0e4b121209 | ||
|
|
3e469c5a44 | ||
|
|
e760a4140b | ||
|
|
2048975e92 | ||
|
|
cf5312ed2e | ||
|
|
8f33ab3487 | ||
|
|
d4d6a5f96d | ||
|
|
a55992276d | ||
|
|
6405c35bc0 | ||
|
|
bd3d7ec9c9 | ||
|
|
cd51ad7508 | ||
|
|
bd5bb2a8a9 | ||
|
|
9bc6366993 | ||
|
|
b6c7737f73 | ||
|
|
6a9d738348 | ||
|
|
6e2f84673e | ||
|
|
63201e992c | ||
|
|
f512047ac6 | ||
|
|
c4293ecd95 | ||
|
|
f047c6da29 | ||
|
|
59874d16b9 | ||
|
|
026236edc9 | ||
|
|
e91e68c48c | ||
|
|
d840cb3be7 | ||
|
|
2b1d2222cc | ||
|
|
b6fdbbd2bb | ||
|
|
0c54c1540c | ||
|
|
fae5f6d64a | ||
|
|
17c4c44426 | ||
|
|
67835e3421 | ||
|
|
832bd6187c | ||
|
|
6507d2be71 | ||
|
|
21785a9322 | ||
|
|
fc387d0ddf | ||
|
|
27e749abb8 | ||
|
|
83143ee570 | ||
|
|
d4252f3056 | ||
|
|
1dd97ebd49 | ||
|
|
bfa15d4719 | ||
|
|
4b22f29826 | ||
|
|
0f14bd3358 | ||
|
|
f7d5d65c0c | ||
|
|
86fbfd3c50 | ||
|
|
cfde9d5a61 | ||
|
|
a9932823c4 | ||
|
|
67b99a88fc | ||
|
|
455ec8c3d8 | ||
|
|
42ece21fa1 | ||
|
|
663ecab51e | ||
|
|
dbae718f4d | ||
|
|
52e76c5496 | ||
|
|
71b6cd630a | ||
|
|
2c36fe3d45 | ||
|
|
28b14777c2 | ||
|
|
4e97a5351a | ||
|
|
2ab5009de7 | ||
|
|
65668e91fe | ||
|
|
d6098dbedf | ||
|
|
fe6b94e539 | ||
|
|
00e60ff855 | ||
|
|
c4882707e9 | ||
|
|
402528d97e | ||
|
|
4e25e335a9 | ||
|
|
972981a579 | ||
|
|
ce5abf8299 | ||
|
|
8bb31861a7 | ||
|
|
7d2e40ee47 | ||
|
|
f0de48a3c4 | ||
|
|
799e66c078 | ||
|
|
55903472aa |
No files matched your search
+102
-94
@@ -1,20 +1,24 @@
|
||||
FROM ubuntu:21.10
|
||||
LABEL maintainer="sgr"
|
||||
FROM ubuntu:24.04
|
||||
LABEL maintainer="wekan"
|
||||
LABEL org.opencontainers.image.ref.name="ubuntu"
|
||||
LABEL org.opencontainers.image.version="24.04"
|
||||
LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
|
||||
|
||||
# 2022-04-25:
|
||||
# - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
|
||||
# so changing to 21.10. https://github.com/wekan/wekan/issues/4488
|
||||
|
||||
ENV BUILD_DEPS="gnupg gosu libarchive-tools wget curl bzip2 g++ build-essential python3 git ca-certificates iproute2"
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ iproute2 apt-transport-https libarchive-tools"
|
||||
ENV DEV_DEPS="curl python3 ca-certificates build-essential git"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.21.4 \
|
||||
METEOR_RELEASE=METEOR@2.13 \
|
||||
METEOR_RELEASE=METEOR@2.14 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=latest \
|
||||
NPM_VERSION=6.14.17 \
|
||||
FIBERS_VERSION=4.0.1 \
|
||||
ARCHITECTURE=linux-x64 \
|
||||
SRC_PATH=./ \
|
||||
@@ -28,15 +32,14 @@ ENV \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
|
||||
ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
ATTACHMENTS_STORE_PATH="" \
|
||||
ATTACHMENTS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
ATTACHMENTS_UPLOAD_MIME_TYPES="" \
|
||||
ATTACHMENTS_UPLOAD_MAX_SIZE=0 \
|
||||
AVATARS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
AVATARS_UPLOAD_MIME_TYPES="" \
|
||||
AVATARS_UPLOAD_MAX_SIZE=0 \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
MAX_IMAGE_PIXEL="" \
|
||||
IMAGE_COMPRESS_RATIO="" \
|
||||
NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \
|
||||
@@ -48,12 +51,15 @@ ENV \
|
||||
MATOMO_SITE_ID="" \
|
||||
MATOMO_DO_NOT_TRACK=true \
|
||||
MATOMO_WITH_USERNAME=false \
|
||||
METRICS_ALLOWED_IP_ADDRESSES="" \
|
||||
BROWSER_POLICY_ENABLED=true \
|
||||
TRUSTED_URL="" \
|
||||
WEBHOOKS_ATTRIBUTES="" \
|
||||
OAUTH2_ENABLED=false \
|
||||
OIDC_REDIRECTION_ENABLED=false \
|
||||
OAUTH2_CA_CERT="" \
|
||||
OAUTH2_ADFS_ENABLED=false \
|
||||
OAUTH2_B2C_ENABLED=false \
|
||||
OAUTH2_LOGIN_STYLE=redirect \
|
||||
OAUTH2_CLIENT_ID="" \
|
||||
OAUTH2_SECRET="" \
|
||||
@@ -70,6 +76,9 @@ ENV \
|
||||
LDAP_ENABLE=false \
|
||||
LDAP_PORT=389 \
|
||||
LDAP_HOST="" \
|
||||
LDAP_AD_SIMPLE_AUTH="" \
|
||||
LDAP_USER_AUTHENTICATION=false \
|
||||
LDAP_USER_AUTHENTICATION_FIELD=uid \
|
||||
LDAP_BASEDN="" \
|
||||
LDAP_LOGIN_FALLBACK=false \
|
||||
LDAP_RECONNECT=true \
|
||||
@@ -87,8 +96,6 @@ ENV \
|
||||
LDAP_ENCRYPTION=false \
|
||||
LDAP_CA_CERT="" \
|
||||
LDAP_REJECT_UNAUTHORIZED=false \
|
||||
LDAP_USER_AUTHENTICATION=false \
|
||||
LDAP_USER_AUTHENTICATION_FIELD=uid \
|
||||
LDAP_USER_SEARCH_FILTER="" \
|
||||
LDAP_USER_SEARCH_SCOPE="" \
|
||||
LDAP_USER_SEARCH_FIELD="" \
|
||||
@@ -143,69 +150,32 @@ ENV \
|
||||
SAML_IDENTIFIER_FORMAT="" \
|
||||
SAML_LOCAL_PROFILE_MATCH_ATTRIBUTE="" \
|
||||
SAML_ATTRIBUTES="" \
|
||||
DEFAULT_WAIT_SPINNER="" \
|
||||
ORACLE_OIM_ENABLED=false \
|
||||
WAIT_SPINNER="" \
|
||||
WRITABLE_PATH=/data \
|
||||
S3=""
|
||||
# \
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
# Add more Node heap:
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
# Add more stack:
|
||||
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
|
||||
|
||||
#---------------------------------------------
|
||||
# == at docker-compose.yml: AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
# https://github.com/wekan/wekan/wiki/autologin
|
||||
#- OIDC_REDIRECTION_ENABLED=true
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Install OS
|
||||
RUN set -o xtrace \
|
||||
&& useradd --user-group -m --system --home-dir /home/wekan wekan \
|
||||
&& apt-get update \
|
||||
&& apt-get install --assume-yes --no-install-recommends apt-utils apt-transport-https ca-certificates 2>&1 \
|
||||
&& apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS}
|
||||
|
||||
# OLD:
|
||||
# && curl -fsSLO --compressed "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$ARCHITECTURE.tar.xz" \
|
||||
# && curl -fsSLO --compressed "https://nodejs.org/dist/$NODE_VERSION/SHASUMS256.txt.asc" \
|
||||
|
||||
# Install NodeJS
|
||||
RUN set -o xtrace \
|
||||
&& cd /tmp \
|
||||
&& curl -fsSLO --compressed "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.xz" \
|
||||
&& curl -fsSLO --compressed "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt" \
|
||||
&& grep " node-$NODE_VERSION-$ARCHITECTURE.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
|
||||
&& tar -xJf "node-$NODE_VERSION-$ARCHITECTURE.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
|
||||
&& rm "node-$NODE_VERSION-$ARCHITECTURE.tar.xz" SHASUMS256.txt \
|
||||
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs \
|
||||
&& mkdir -p /usr/local/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config \
|
||||
&& npm install -g npm@${NPM_VERSION} \
|
||||
&& chown wekan:wekan --recursive /home/wekan/.config
|
||||
|
||||
ENV DEBIAN_FRONTEND=dialog
|
||||
|
||||
USER wekan
|
||||
|
||||
# Install Meteor
|
||||
RUN set -o xtrace \
|
||||
&& cd /home/wekan \
|
||||
&& curl https://install.meteor.com/?release=$METEOR_VERSION --output /home/wekan/install-meteor.sh \
|
||||
# Replace tar with bsdtar in the install script; https://github.com/jshimko/meteor-launchpad/issues/39
|
||||
&& sed --in-place "s/tar -xzf.*/bsdtar -xf \"\$TARBALL_FILE\" -C \"\$INSTALL_TMPDIR\"/g" /home/wekan/install-meteor.sh \
|
||||
&& sed --in-place 's/VERBOSITY="--silent"/VERBOSITY="--progress-bar"/' /home/wekan/install-meteor.sh \
|
||||
&& printf "\n[-] Installing Meteor $METEOR_VERSION...\n\n" \
|
||||
&& sh /home/wekan/install-meteor.sh
|
||||
|
||||
ENV PATH=$PATH:/home/wekan/.meteor/
|
||||
|
||||
USER root
|
||||
|
||||
RUN echo "export PATH=$PATH" >> /etc/environment
|
||||
|
||||
USER wekan
|
||||
RUN <<EOR
|
||||
echo "export PATH=$PATH" >> /etc/environment
|
||||
EOR
|
||||
|
||||
# Copy source dir
|
||||
RUN set -o xtrace \
|
||||
&& mkdir -p /home/wekan/app/.meteor \
|
||||
&& mkdir -p /home/wekan/app/packages
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
mkdir -p /home/wekan/app/.meteor
|
||||
mkdir -p /home/wekan/app/packages
|
||||
EOR
|
||||
|
||||
COPY \
|
||||
.meteor/.finished-upgraders \
|
||||
@@ -230,44 +200,83 @@ COPY \
|
||||
packages \
|
||||
/home/wekan/app/packages/
|
||||
|
||||
USER root
|
||||
# Install OS
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
RUN set -o xtrace \
|
||||
&& chown -R wekan:wekan /home/wekan/app /home/wekan/.meteor
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan
|
||||
# OS dependencies
|
||||
apt-get update --assume-yes
|
||||
apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS} ${DEV_DEPS}
|
||||
|
||||
USER wekan
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~
|
||||
ln -sf $(which bsdtar) $(which tar)
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
# Build app
|
||||
cd /home/wekan/app && \
|
||||
/home/wekan/.meteor/meteor add standard-minifier-js && \
|
||||
/home/wekan/.meteor/meteor npm install && \
|
||||
/home/wekan/.meteor/meteor build --directory /home/wekan/app_build
|
||||
# Install NodeJS
|
||||
cd /tmp
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
chmod u+w package.json npm-shrinkwrap.json && \
|
||||
npm install && \
|
||||
cd node_modules/fibers && \
|
||||
node build.js
|
||||
# Download nodejs
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz"
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt"
|
||||
|
||||
# Verify nodejs authenticity
|
||||
grep "node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz" "SHASUMS256.txt" | shasum -a 256 -c -
|
||||
rm -f "SHASUMS256.txt"
|
||||
|
||||
# Install Node
|
||||
tar xzf "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" -C /usr/local --strip-components=1 --no-same-owner
|
||||
rm "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" "SHASUMS256.txt"
|
||||
ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
|
||||
mkdir -p "/opt/nodejs/lib/node_modules/fibers/.node-gyp" "/root/.node-gyp/${NODE_VERSION} /home/wekan/.config"
|
||||
|
||||
# Install node dependencies
|
||||
npm install -g npm@${NPM_VERSION}
|
||||
chown --recursive wekan:wekan /home/wekan/.config
|
||||
|
||||
# Install Meteor
|
||||
cd /home/wekan
|
||||
chown --recursive wekan:wekan /home/wekan
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n"
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh
|
||||
mv /root/.meteor /home/wekan/
|
||||
chown --recursive wekan:wekan /home/wekan/.meteor
|
||||
|
||||
# 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 (Development)
|
||||
cd /home/wekan/app
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor npm install
|
||||
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar)
|
||||
|
||||
USER root
|
||||
# Cleanup
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
apt-get clean -y && \
|
||||
apt-get autoremove -y && \
|
||||
rm -Rf /tmp/* && \
|
||||
rm -Rf /home/wekan/app_build && \
|
||||
rm -Rf /var/cache/apt /var/lib/apt/lists && \
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
apt-get remove --purge --assume-yes ${BUILD_DEPS}
|
||||
apt-get install --assume-yes --no-install-recommends build-essential
|
||||
apt-get autoremove --assume-yes
|
||||
apt-get clean --assume-yes
|
||||
rm -Rf /tmp/*
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
rm -Rf /var/cache/apt
|
||||
rm -Rf /var/lib/apt/lists
|
||||
rm -Rf /home/wekan/app_build
|
||||
|
||||
mkdir /data
|
||||
chown wekan --recursive /data
|
||||
EOR
|
||||
|
||||
USER wekan
|
||||
|
||||
ENV PORT=3000
|
||||
EXPOSE $PORT
|
||||
|
||||
STOPSIGNAL SIGKILL
|
||||
WORKDIR /home/wekan/app
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
@@ -277,7 +286,6 @@ WORKDIR /home/wekan/app
|
||||
# Add more stack:
|
||||
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
|
||||
#---------------------------------------------------------------------
|
||||
#TODO:
|
||||
#CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
#
|
||||
|
||||
CMD ["/home/wekan/.meteor/meteor", "run", "--verbose", "--settings", "settings.json"]
|
||||
+29
-11
@@ -1,18 +1,24 @@
|
||||
## Issue
|
||||
<!--
|
||||
Please report these elsewhere:
|
||||
|
||||
Please report these issues elsewhere:
|
||||
|
||||
- SECURITY ISSUES, PGP EMAIL: https://github.com/wekan/wekan/blob/main/SECURITY.md
|
||||
- UCS: https://github.com/wekan/univention/issues
|
||||
|
||||
**[PLEASE UPGRADE](https://github.com/wekan/wekan/wiki/Backup)** to the newest WeKan ® before reporting an issue.
|
||||
**[PLEASE UPGRADE](https://github.com/wekan/wekan/wiki/Backup)** to the newest
|
||||
WeKan ® before reporting an issue, if possible.
|
||||
|
||||
Please search existing Open and Closed issues, most questions have already been answered.
|
||||
|
||||
If you can not login for any reason: https://github.com/wekan/wekan/wiki/Forgot-Password
|
||||
Email settings, only SMTP MAIL_URL and MAIL_FROM are in use: https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
|
||||
-->
|
||||
Email settings, only SMTP MAIL_URL and MAIL_FROM are in use:
|
||||
https://github.com/wekan/wekan/wiki/Troubleshooting-Mail
|
||||
|
||||
### Server Setup Information
|
||||
<!-- Please anonymize info, and do not any of your Wekan board URLs, passwords, API tokens etc to this public issue. -->
|
||||
|
||||
Please anonymize info, and do not any of your Wekan board URLs, passwords,
|
||||
API tokens etc to this public issue.
|
||||
|
||||
* Did you test in newest Wekan?:
|
||||
* Did you configure root-url correctly so Wekan cards open correctly (see https://github.com/wekan/wekan/wiki/Settings)?
|
||||
* Operating System:
|
||||
@@ -23,13 +29,25 @@ Email settings, only SMTP MAIL_URL and MAIL_FROM are in use: https://github.com/
|
||||
* What webbrowser version are you using (Wekan should work on all modern browsers that support Javascript)?
|
||||
|
||||
### Problem description
|
||||
<!-- Add a recorded animated gif (e.g. with https://github.com/phw/peek) about how it works currently, and screenshot mockups how it should work. -->
|
||||
|
||||
Add a recorded animated gif (e.g. with https://github.com/phw/peek) about
|
||||
how it works currently, and screenshot mockups how it should work.
|
||||
|
||||
|
||||
#### Reproduction Steps
|
||||
|
||||
#### Logs
|
||||
<!-- Check Right Click>Inspect>Console in you browser - generally Chrome shows more detailed info than Firefox. -->
|
||||
|
||||
<!-- Please anonymize logs.
|
||||
|
||||
#### Logs
|
||||
|
||||
Check Right Click / Inspect / Console in you browser - generally Chromium
|
||||
based browsers show more detailed info than Firefox based browsers.
|
||||
|
||||
Please anonymize logs.
|
||||
|
||||
Snap: sudo snap logs wekan.wekan
|
||||
|
||||
Docker: sudo docker logs wekan-app
|
||||
If logs are very long, attach them in .zip file -->
|
||||
|
||||
If logs are very long, attach them in .zip file
|
||||
|
||||
@@ -11,4 +11,4 @@ jobs:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v4
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v3
|
||||
uses: actions/dependency-review-action@v4
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
# https://github.com/docker/login-action
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d
|
||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -48,14 +48,14 @@ jobs:
|
||||
# https://github.com/docker/metadata-action
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934
|
||||
uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
|
||||
# Build and push Docker image with Buildx (don't push on PR)
|
||||
# https://github.com/docker/build-push-action
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09
|
||||
uses: docker/build-push-action@5176d81f87c23d6fc96624dfdbcd9f3830bbe445
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -25,6 +25,6 @@ jobs:
|
||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||
|
||||
- name: Run chart-releaser
|
||||
uses: helm/chart-releaser-action@v1.5.0
|
||||
uses: helm/chart-releaser-action@v1.6.0
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
@@ -95,7 +95,7 @@ jobs:
|
||||
# CACHING
|
||||
- name: Install Meteor
|
||||
id: cache-meteor-install
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.meteor
|
||||
key: v1-meteor-${{ hashFiles('.meteor/versions') }}
|
||||
@@ -104,7 +104,7 @@ jobs:
|
||||
|
||||
- name: Cache NPM dependencies
|
||||
id: cache-meteor-npm
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: v1-npm-${{ hashFiles('package-lock.json') }}
|
||||
@@ -113,7 +113,7 @@ jobs:
|
||||
|
||||
- name: Cache Meteor build
|
||||
id: cache-meteor-build
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
.meteor/local/resolver-result-cache.json
|
||||
@@ -125,7 +125,7 @@ jobs:
|
||||
v1-meteor_build_cache-
|
||||
|
||||
- name: Setup meteor
|
||||
uses: meteorengineer/setup-meteor@v1
|
||||
uses: meteorengineer/setup-meteor@v2
|
||||
with:
|
||||
meteor-release: '2.2'
|
||||
|
||||
@@ -136,7 +136,7 @@ jobs:
|
||||
run: sh ./test-wekan.sh -cv
|
||||
|
||||
- name: Upload coverage
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: coverage-folder
|
||||
path: .coverage/
|
||||
@@ -150,14 +150,14 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download coverage
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: coverage-folder
|
||||
path: .coverage/
|
||||
|
||||
|
||||
- name: Coverage Report
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v3.0.0
|
||||
with:
|
||||
path: ".coverage/lcov.info"
|
||||
min_coverage: 1 # TODO add tests and increase to 95!
|
||||
+6
-6
@@ -6,7 +6,7 @@
|
||||
meteor-base@1.5.1
|
||||
|
||||
# Build system
|
||||
ecmascript@0.16.7
|
||||
ecmascript@0.16.8
|
||||
standard-minifier-js@2.8.1
|
||||
mquandalle:jade
|
||||
coffeescript@2.4.1!
|
||||
@@ -20,11 +20,11 @@ cottz:publish-relations
|
||||
dburles:collection-helpers
|
||||
idmontie:migrations
|
||||
easy:search
|
||||
mongo@1.16.7
|
||||
mongo@1.16.8
|
||||
mquandalle:collection-mutations
|
||||
|
||||
# Account system
|
||||
accounts-password@2.3.4
|
||||
accounts-password@2.4.0
|
||||
useraccounts:core
|
||||
useraccounts:flow-routing
|
||||
useraccounts:unstyled
|
||||
@@ -42,7 +42,7 @@ jquery@3.0.0!
|
||||
random@1.2.1
|
||||
reactive-dict@1.3.1
|
||||
session@1.2.1
|
||||
tracker@1.3.2
|
||||
tracker@1.3.3
|
||||
underscore@1.0.13
|
||||
arillo:flow-router-helpers
|
||||
audit-argument-checks@1.0.7
|
||||
@@ -83,14 +83,14 @@ matb33:collection-hooks
|
||||
simple:json-routes
|
||||
kadira:flow-router
|
||||
spacebars
|
||||
service-configuration@1.3.1
|
||||
service-configuration@1.3.2
|
||||
communitypackages:picker
|
||||
minifier-css@1.6.4
|
||||
blaze
|
||||
kadira:blaze-layout
|
||||
peerlibrary:blaze-components
|
||||
ejson@1.1.3
|
||||
logging@1.3.2
|
||||
logging@1.3.3
|
||||
wekan-fullcalendar
|
||||
momentjs:moment@2.29.3
|
||||
wekan-fontawesome
|
||||
+1
-1
@@ -1 +1 @@
|
||||
METEOR@2.13.3
|
||||
METEOR@2.14
|
||||
+23
-22
@@ -1,6 +1,6 @@
|
||||
accounts-base@2.2.8
|
||||
accounts-oauth@1.4.2
|
||||
accounts-password@2.3.4
|
||||
accounts-base@2.2.10
|
||||
accounts-oauth@1.4.3
|
||||
accounts-password@2.4.0
|
||||
aldeed:collection2@2.10.0
|
||||
aldeed:collection2-core@1.2.0
|
||||
aldeed:schema-deny@1.1.0
|
||||
@@ -10,13 +10,13 @@ allow-deny@1.1.1
|
||||
arillo:flow-router-helpers@0.5.2
|
||||
audit-argument-checks@1.0.7
|
||||
autoupdate@1.8.0
|
||||
babel-compiler@7.10.4
|
||||
babel-compiler@7.10.5
|
||||
babel-runtime@1.5.1
|
||||
base64@1.0.12
|
||||
binary-heap@1.0.11
|
||||
blaze@2.7.1
|
||||
blaze-tools@1.1.3
|
||||
boilerplate-generator@1.7.1
|
||||
boilerplate-generator@1.7.2
|
||||
caching-compiler@1.2.2
|
||||
caching-html-compiler@1.2.1
|
||||
callback-hook@1.5.1
|
||||
@@ -29,22 +29,22 @@ dburles:collection-helpers@1.1.0
|
||||
ddp@1.4.1
|
||||
ddp-client@2.6.1
|
||||
ddp-common@1.4.0
|
||||
ddp-rate-limiter@1.2.0
|
||||
ddp-server@2.6.2
|
||||
ddp-rate-limiter@1.2.1
|
||||
ddp-server@2.7.0
|
||||
deps@1.0.12
|
||||
diff-sequence@1.1.2
|
||||
dynamic-import@0.7.3
|
||||
easy:search@2.2.1
|
||||
easysearch:components@2.2.2
|
||||
easysearch:core@2.2.2
|
||||
ecmascript@0.16.7
|
||||
ecmascript@0.16.8
|
||||
ecmascript-runtime@0.8.1
|
||||
ecmascript-runtime-client@0.12.1
|
||||
ecmascript-runtime-server@0.11.0
|
||||
ejson@1.1.3
|
||||
email@2.2.5
|
||||
es5-shim@4.8.0
|
||||
fetch@0.1.3
|
||||
fetch@0.1.4
|
||||
geojson-utils@1.0.11
|
||||
hot-code-push@1.0.4
|
||||
html-tools@1.1.3
|
||||
@@ -60,10 +60,10 @@ kadira:flow-router@2.12.1
|
||||
konecty:mongo-counter@0.0.5_3
|
||||
lmieulet:meteor-coverage@1.1.4
|
||||
localstorage@1.2.0
|
||||
logging@1.3.2
|
||||
logging@1.3.3
|
||||
matb33:collection-hooks@1.3.0
|
||||
mdg:validation-error@0.5.1
|
||||
meteor@1.11.3
|
||||
meteor@1.11.5
|
||||
meteor-autosize@5.0.1
|
||||
meteor-base@1.5.1
|
||||
meteorhacks:aggregate@1.3.0
|
||||
@@ -77,11 +77,11 @@ minifier-css@1.6.4
|
||||
minifier-js@2.7.5
|
||||
minifiers@1.1.8-faster-rebuild.0
|
||||
minimongo@1.9.3
|
||||
modern-browsers@0.1.9
|
||||
modules@0.19.0
|
||||
modern-browsers@0.1.10
|
||||
modules@0.20.0
|
||||
modules-runtime@0.13.1
|
||||
momentjs:moment@2.29.3
|
||||
mongo@1.16.7
|
||||
mongo@1.16.8
|
||||
mongo-decimal@0.1.3
|
||||
mongo-dev-server@1.1.0
|
||||
mongo-id@1.0.8
|
||||
@@ -94,8 +94,8 @@ mquandalle:jade-compiler@0.4.5
|
||||
mquandalle:jquery-textcomplete@0.8.0_1
|
||||
mquandalle:mousetrap-bindglobal@0.0.1
|
||||
msavin:usercache@1.8.0
|
||||
npm-mongo@4.16.0
|
||||
oauth@2.2.0
|
||||
npm-mongo@4.17.2
|
||||
oauth@2.2.1
|
||||
oauth2@1.3.2
|
||||
observe-sequence@1.0.21
|
||||
ongoworks:speakingurl@1.1.0
|
||||
@@ -111,19 +111,19 @@ peerlibrary:blaze-components@0.23.0
|
||||
peerlibrary:computed-field@0.10.0
|
||||
peerlibrary:data-lookup@0.3.0
|
||||
peerlibrary:reactive-field@0.6.0
|
||||
percolate:synced-cron@1.3.2
|
||||
percolate:synced-cron@1.5.2
|
||||
promise@0.12.2
|
||||
raix:eventemitter@0.1.3
|
||||
raix:handlebar-helpers@0.2.5
|
||||
random@1.2.1
|
||||
rate-limit@1.1.1
|
||||
react-fast-refresh@0.2.7
|
||||
react-fast-refresh@0.2.8
|
||||
reactive-dict@1.3.1
|
||||
reactive-var@1.0.12
|
||||
reload@1.3.1
|
||||
retry@1.1.0
|
||||
routepolicy@1.1.1
|
||||
service-configuration@1.3.1
|
||||
service-configuration@1.3.3
|
||||
session@1.2.1
|
||||
sha@1.0.9
|
||||
shell-server@0.5.0
|
||||
@@ -132,7 +132,7 @@ simple:json-routes@2.3.1
|
||||
simple:rest-accounts-password@1.2.2
|
||||
simple:rest-bearer-token-parser@1.1.1
|
||||
simple:rest-json-error-handler@1.1.1
|
||||
socket-stream-client@0.5.1
|
||||
socket-stream-client@0.5.2
|
||||
spacebars@1.4.1
|
||||
spacebars-compiler@1.3.1
|
||||
standard-minifier-js@2.8.1
|
||||
@@ -141,14 +141,15 @@ templating@1.4.1
|
||||
templating-compiler@1.4.1
|
||||
templating-runtime@1.5.0
|
||||
templating-tools@1.2.2
|
||||
tracker@1.3.2
|
||||
tracker@1.3.3
|
||||
typescript@4.9.5
|
||||
ui@1.0.13
|
||||
underscore@1.0.13
|
||||
url@1.3.2
|
||||
useraccounts:core@1.16.2
|
||||
useraccounts:flow-routing@1.15.0
|
||||
useraccounts:unstyled@1.14.2
|
||||
webapp@1.13.5
|
||||
webapp@1.13.6
|
||||
webapp-hashing@1.1.1
|
||||
wekan-accounts-cas@0.1.0
|
||||
wekan-accounts-lockout@1.0.0
|
||||
|
||||
+828
-14
@@ -1,25 +1,839 @@
|
||||
[Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac)
|
||||
|
||||
Newest Node.js is at https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4
|
||||
Newest WeKan at these amd64 platforms:
|
||||
|
||||
Required versions of Node.js, MongoDB etc are listed at https://wekan.github.io
|
||||
Download section.
|
||||
- Windows and Linux bundle
|
||||
- Snap Candidate
|
||||
- Docker
|
||||
- Kubernetes
|
||||
|
||||
Newest WeKan is on platforms: Snap Candidate, Docker, Kubernetes, Source/Bundle. Download section at https://wekan.github.io
|
||||
Fixing other platforms In Progress.
|
||||
|
||||
In Progress is:
|
||||
- Getting newest WeKan to all platforms, fixing any migration and upgrade issues
|
||||
- Adding more platforms
|
||||
- Developing all paid features and fixes https://wekan.team/commercial-support/
|
||||
- More info and news at https://github.com/wekan/wekan/issues/4578#issuecomment-1505909376
|
||||
|
||||
Note:
|
||||
- Snap Candidate has newest WeKan with MongoDB 6 https://github.com/wekan/wekan/issues/4824#issuecomment-1425753485
|
||||
- Snap Beta has old WeKan with MongoDB 5 https://github.com/wekan/wekan/issues/4780#issuecomment-1427625571
|
||||
- Snap Stable has old WeKan 6.09 with MongoDB 3.2.2
|
||||
- Install info at Server part of webpage https://wekan.github.io
|
||||
- Newest Node.js is at https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4
|
||||
- MongoDB 6.x
|
||||
|
||||
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
|
||||
|
||||
# v7.55 2024-08-08 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix board backgrounds not showing correctly after v7.54](https://github.com/wekan/wekan/pull/5501).
|
||||
Thanks to walster001.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.54 2024-08-07 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Helm Chart: Add Support for Overriding Image Registry in Airgapped Environments](https://github.com/wekan/charts/pull/35).
|
||||
Thanks to geilername.
|
||||
- [PWA, move to standalone (standard) to display the status bar](https://github.com/wekan/wekan/pull/5484)
|
||||
Thanks to mfilser.
|
||||
- [Added info how with Caddy webserver config, PWA and Android app override icons, showing toolbars, etc](https://github.com/wekan/wekan/commit/55fc342f6d90d8e30b70a8903ecead1c4370bd89).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Don't set background image in .board-canvas too](https://github.com/wekan/wekan/pull/5485).
|
||||
Thanks to mfilser.
|
||||
- [Bugfix, variable "color" didn't exist](https://github.com/wekan/wekan/pull/5486).
|
||||
Thanks to mfilser.
|
||||
- [Little opacity to minicards to see the background image a little bit](https://github.com/wekan/wekan/pull/5487).
|
||||
Thanks to mfilser.
|
||||
- [Remove attachment storage name from attachment list](https://github.com/wekan/wekan/pull/5488).
|
||||
Thanks to mfilser.
|
||||
- [Attachment popup back was broken since new attachment viewer, now fixed](https://github.com/wekan/wekan/pull/5489).
|
||||
Thanks to mfilser.
|
||||
- [Change Meteor.user() to ReactiveCache.getCurrentUser()](https://github.com/wekan/wekan/pull/5490).
|
||||
Thanks to mfilser.
|
||||
- [Fix empty parentId in cards](https://github.com/wekan/wekan/pull/5491).
|
||||
Thanks to mfilser.
|
||||
- [Sidebar xmark icon, add padding and background color](https://github.com/wekan/wekan/pull/5492).
|
||||
Thanks to mfilser.
|
||||
- [Board view, first column a bit smaller to save screen space](https://github.com/wekan/wekan/pull/5493).
|
||||
Thanks to mfilser.
|
||||
- [Minicard, show creator, defaultValue of schema and other code is now the same](https://github.com/wekan/wekan/pull/5494).
|
||||
Thanks to mfilser.
|
||||
- [Editor, Bugfix, copy text is now at each editor (textarea) again](https://github.com/wekan/wekan/pull/5495).
|
||||
Thanks to mfilser.
|
||||
- [Bugfix, Cards Count on mobile view was missing](https://github.com/wekan/wekan/pull/5496).
|
||||
Thanks to mfilser.
|
||||
- [ListHeader, simpler code logic at collapsed if conditions](https://github.com/wekan/wekan/pull/5497).
|
||||
Thanks to mfilser.
|
||||
- [Bugfix, edit description didn't work if it was clicked](https://github.com/wekan/wekan/pull/5498).
|
||||
Thanks to mfilser.
|
||||
- [Fix LDAP login fails after upgrade](https://github.com/wekan/wekan/commit/a4169f3da773e4fd961acd0266260085a753cdab).
|
||||
Thanks to juppees and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.53 2024-08-03 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added Dragscroll to scroll the board](https://github.com/wekan/wekan/pull/5477).
|
||||
Click on an empty space in the board, hold the left mouse and move left and right
|
||||
to scroll the board easily.
|
||||
Thanks to mfilser.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated release script: New install webpage location](https://github.com/wekan/wekan/commit/5e639a7c2d6dc1182ba95e44875ac8a6798a62be).
|
||||
Thanks to xet7.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/3f9ae57144dc9befd674c784896d68b5db9df146).
|
||||
Thanks to developers of dependencies.
|
||||
- [Copied changes from wiki to docs](https://github.com/wekan/wekan/commit/aaca60b6760cc84b56a24fc15c93f23b4a34f06e).
|
||||
Thanks to xet7.
|
||||
- [Updated Snap Candidate to MongoDB 6.0.16](https://github.com/wekan/wekan/commit/1af1844f37d17f9f54ca358ccf0f44eed1dfbef4).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Board Menu Popup's were opened twice because of 2 same event creation](https://github.com/wekan/wekan/pull/5478).
|
||||
Thanks to mfilser.
|
||||
- [Fixing of "mode is undefined" on first activity component creation](https://github.com/wekan/wekan/pull/5479).
|
||||
Thanks to mfilser.
|
||||
- [Changing card color now closes the popup and doesn't refresh the whole board page](https://github.com/wekan/wekan/pull/5480).
|
||||
Thanks to mfilser.
|
||||
- [Fix dragscroll package name](https://github.com/wekan/wekan/commit/45674806d78fddb8a3b8a75890e5059cc1a680ea).
|
||||
Thanks to xet7.
|
||||
- [Reducing card size in database if no planning poker was started](https://github.com/wekan/wekan/pull/5481).
|
||||
Thanks to mfilser.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.52 2024-08-03 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Helm Chart: Add option to set resource limits for initContainer](https://github.com/wekan/charts/pull/33).
|
||||
Thanks to mreichelt-dicos.
|
||||
- [Helm Chart: Fixes for mongodb persistence. Please test is this correct](https://github.com/wekan/charts/commit/7efb071dd91d76c3971e1865fd18f9d43d8c6891).
|
||||
Thanks to emoritzx.
|
||||
- [Helm Chart: Added info about rarely used running WeKan at subpath](https://github.com/wekan/charts/commit/7d4176c7b328c5477c1fa29a323574aac78616a9).
|
||||
Thanks to emoritzx.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5460),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5464),
|
||||
[Part 3](https://github.com/wekan/wekan/pull/5460),
|
||||
[Part 4](https://github.com/wekan/wekan/pull/5469),
|
||||
[Part 5](https://github.com/wekan/wekan/pull/5470),
|
||||
[Part 6](https://github.com/wekan/wekan/pull/5471),
|
||||
[Part 7](https://github.com/wekan/wekan/pull/5473).
|
||||
Thanks to dependabot.
|
||||
- Added RepoCloud SaaS.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/21d6dfd79090f9885635f55537bd9fa1ef8539e1),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/e663ce038af397f547e8823d61ce5dc2e3cea84d),
|
||||
[Part 3](https://github.com/wekan/wekan.github.io/commit/e9e0550824cdda31daae42df7c497fbd037fd78f).
|
||||
Thanks to RepoCloud.
|
||||
- [Updated WeKan app webmanifest](https://github.com/wekan/wekan/commit/745618626535743938b9d2e8c88afe6345807a85).
|
||||
Thanks to xet7.
|
||||
- [Revert forking of ldapjs](https://github.com/wekan/wekan/commit/c89f3ba3da6512169e033d76377a9190b35a92d2).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixes to Clean light and Clean dark themes](https://github.com/wekan/wekan/pull/5458).
|
||||
Thanks to abramchikd.
|
||||
- [Activities, adding back "created at" field](https://github.com/wekan/wekan/pull/5476).
|
||||
Thanks to mfilser.
|
||||
- [Fix typos at attachments code](https://github.com/wekan/wekan/commit/de3bc9cb4d20590c45ff72ef7749d830ea3fc16c).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.51 2024-06-27 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/pull/5452).
|
||||
Thanks to dependabot.
|
||||
- Moved docs from wiki to wekan repo docs directory, organized to subdirectories. Organizing and updating in progress.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/1961e22cbd51e83aa131c8b092c7d43475a021eb),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/ce89ff48331a27ffb42d021833c78df3a462b9db),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/449c02c42a0183a49592ada89bdfb8f25e5db903),
|
||||
[Part 4](https://github.com/wekan/wekan/commit/0fb2f7fdd6b6cb828ab4ea534204a5b834d2e19a),
|
||||
[Part 5](https://github.com/wekan/wekan/commit/e9c1c620eb938349c30761497066daf41cdcfc19),
|
||||
[Part 6](https://github.com/wekan/wekan/commit/6b7b66801b716e1d0bf2548b18eed4ed4e354f2d),
|
||||
[Part 7](https://github.com/wekan/wekan/commit/1cfaddff9cd4fe84fb74c80d1585f2a5dd65f5ca),
|
||||
[Part 8](https://github.com/wekan/wekan/commit/057ac4031eaa912b849c637e163f4dffa79a9329),
|
||||
[Part 9](https://github.com/wekan/wekan/commit/52375df78380bbe3407b51dc986baaf6f31f40e4),
|
||||
[Part 10](https://github.com/wekan/wekan/commit/00a56f6aaa0c2bcd24ca8829a0718b45e7cedf04),
|
||||
[Part 11](https://github.com/wekan/wekan/commit/c863428aa2597457fc4931e7b1bdd75d6cc2610b).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix ModernDark Cards not showing correctly](https://github.com/wekan/wekan/pull/5455).
|
||||
Thanks to walster001.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.50 2024-06-22 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added "Clean dark" and "Clean light" themes that are more clean and modern looking](https://github.com/wekan/wekan/pull/5449).
|
||||
Thanks to abramchikd.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated docs for WeKan version for Windows.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/9b428150a4fb9efdcb2ae9d3bb59d0da29529e69),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/3c35a6400b88e071a474a552ee941892522c8d59).
|
||||
Thanks to xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5446),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/99a8afd6c39591e0d85fe5f55ebc3016b9e7f011).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Task card may overflow below the screen when maximized, making the bottom part not viewable](https://github.com/wekan/wekan/pull/5443).
|
||||
Thanks to Hekatomb.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.49 2024-06-11 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [WeKan new release version number from wiki to WeKan repo docs](https://github.com/wekan/wekan/commit/e5c7650fc8eb5c3fcc6216f12e806ceb56fd94d9).
|
||||
Thanks to xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5430),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5441).
|
||||
Thanks to dependabot.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Bugfix: Strikethrough inactive Teams and orginizations logic was inverted](https://github.com/wekan/wekan/pull/5435).
|
||||
Thanks to Hekatomb.
|
||||
- [Changed back to original icon of Edit Description](https://github.com/wekan/wekan/commit/e3214c874ec9369ab6b865154f7964da8ec55f45).
|
||||
Thanks to saschafoerster, C0rn3j and xet7.
|
||||
- [Fill out Org and Team in adminReports](https://github.com/wekan/wekan/pull/5440).
|
||||
Thanks to Hekatomb.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.48 2024-06-06 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated release scripts](https://github.com/wekan/wekan/commit/4a9d881e47751ec49d24af5bf4fd1c5452ceb194).
|
||||
Thanks to xet7.
|
||||
- Add changes from wiki to docs.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/13be8160d5b6a894c674d04c37ff9e653e7bd4b0),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/e65a8c90177cd948ca8212486a365b65cd7d5372).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Admin Panel pages Organizations and Teams, where HTML Tables were broken](https://github.com/wekan/wekan/commit/36bb5e099ed9f1f88c0399867bd76f040467745c).
|
||||
Thanks to Hekatomb and xet7.
|
||||
- [Try to show more of title of collapsed list](https://github.com/wekan/wekan/commit/ec0e88ad2e914437b4767456a160f2c1138fc5f2).
|
||||
Thanks to C0rn3j and xet7.
|
||||
- [Allow Normal user to add new swimlane, list and label](https://github.com/wekan/wekan/commit/04b995e77fdb5abc186e02482a75aba6a5cf0759).
|
||||
Thanks to RyanHecht, norrig and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.47 2024-06-03 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update Docker base images to Ubuntu 24.04](https://github.com/wekan/wekan/commit/79e2001708b5110b26cf54b15bbbf90f7977fe90).
|
||||
Thanks to xet7.
|
||||
- [Updated to MongoDB 6.0.15 at Snap Candidate](https://github.com/wekan/wekan/commit/4e2a8735bc2e449a2a3c949d042fb625052a1152).
|
||||
Thanks to MongoDB developers.
|
||||
- [Updated release scripts](https://github.com/wekan/wekan/commit/2c9c9c43561093801004f0268d58b29d9a10b570).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Only show Board name edit button to BoardAdmin](https://github.com/wekan/wekan/commit/5e2b423ef87c62a70a6b08abd2f185fd560f391f).
|
||||
Thanks to xet7.
|
||||
- [Fix Edit Description button is wildly out of place](https://github.com/wekan/wekan/commit/1f2fb2ccce38e9cac348f1c459784d6e5a949ded).
|
||||
Thanks to C0rn3j and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.46 2024-06-03 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update ukrainian translation](https://github.com/wekan/wekan/pull/5405).
|
||||
Thanks to novashdima.
|
||||
- [Updated GitHub issue template for issue instructions to be more visible](https://github.com/wekan/wekan/commit/5124265142c94d5044b81f81eaaa9c3bc01cef58).
|
||||
Thanks to xet7.
|
||||
- [For development, only recommend Debian 12 amd64, because Sandstorm works at Debian 12. Sandstorm does not work at Ubuntu 24.04](https://github.com/wekan/wekan/commit/1bd30bc12129be8cc8a633a561bb8a5be76823d7).
|
||||
Thanks to xet7. Related https://github.com/sandstorm-io/sandstorm/issues/3712
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Optimize SVGs and PNGs to save 550KB](https://github.com/wekan/wekan/pull/5403).
|
||||
Thanks to C0rn3j.
|
||||
- [Swap deprecated egrep for grep -E](https://github.com/wekan/wekan/pull/5404).
|
||||
Thanks to C0rn3j.
|
||||
- [Remove notification while copying board](https://github.com/wekan/wekan/pull/5412).
|
||||
Thanks to e-gaulue.
|
||||
- [Fixed loading of cards if there are more than 20 of them on one swimlane](https://github.com/wekan/wekan/pull/5417).
|
||||
Thanks to novashdima.
|
||||
- [Devcontainer, reduce image size and other necessary changes for development](https://github.com/wekan/wekan/pull/5418).
|
||||
Thanks to mfilser.
|
||||
- [Dockerfile production and dev same build](https://github.com/wekan/wekan/pull/5419).
|
||||
Thanks to mfilser.
|
||||
- [Remove second created at on activities](https://github.com/wekan/wekan/pull/5420).
|
||||
Thanks to mfilser.
|
||||
- [Fix Export CSV/TSV from Board create unhandled Exception](https://github.com/wekan/wekan/pull/5424).
|
||||
Thanks to Dexus.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.45 2024-05-06 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update Docker base container to Ubuntu 24.04, and update software versions](https://github.com/wekan/wekan/commit/63117e87e759af965c8eeceaaa41f52815630d20).
|
||||
Thanks to developers of dependencies.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/pull/5392).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix display of tables with a large number of rows](https://github.com/wekan/wekan/pull/5393).
|
||||
Thanks to novashdima.
|
||||
- [Fix white List color and define Silver in CSS instead of leaving it unset](https://github.com/wekan/wekan/pull/5400).
|
||||
Thanks to C0rn3j.
|
||||
- [Allow silver color to be set in List and Swimlane](https://github.com/wekan/wekan/pull/5401).
|
||||
Thanks to C0rn3j.
|
||||
- [Fix Can't set a Due Date that has a leading zero in time, errors with invalid time](https://github.com/wekan/wekan/commit/9cebee734740790145ca574c539ccebd067cee7e).
|
||||
Thanks to C0rn3j and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.44 2024-04-26 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Collapse Lists](https://github.com/wekan/wekan/commit/a601ba542aebefdfa8b5d683d22405ab3d5f8569).
|
||||
Thanks to xet7.
|
||||
- [Collapse Swimlanes. In Progress, does not work yet, not visible yet](https://github.com/wekan/wekan/commit b704d58f0f3cf5e7785b79d5a6c9f6c63da4159c).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix board not visible at Collapse Lists](https://github.com/wekan/wekan/commit/e6476319bcb06cc71fa0eefa0a608ec3a7b89767).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.43 2024-04-18 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated release script for Windows On-Premise, that is without container like Docker and Snap](https://github.com/wekan/wekan/commit/802eeb1e6bb87c45fa79298f67ff690e87f939f8).
|
||||
Thanks to xet7.
|
||||
- [Updated translations Transifex URL at readme](https://github.com/wekan/wekan/commit/9838af5e5630a6ef34175e110ddfb6bfc225b40c).
|
||||
Thanks to xet7.
|
||||
- [Improve Docker files](https://github.com/wekan/wekan/pull/5377).
|
||||
Thanks to C0rn3j.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/08e2f2f2731856255e0b40eb692328424efdf9ac),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/da99e363cd72cda7d400ce65785a6650e42c72cf).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix DEBUG environment variable check](https://github.com/wekan/wekan/pull/5380).
|
||||
Thanks to verdel.
|
||||
- [By default, use localized long date-time format](https://github.com/wekan/wekan/pull/5381).
|
||||
Thanks to tvogel.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.42 2024-04-03 WeKan ® release
|
||||
|
||||
This release fixes the following CRITICAL SECURITY ISSUES:
|
||||
|
||||
- [Fixed CRITICAL SECURITY ISSUE by updating meteor-node-stubs](https://github.com/wekan/wekan/commit/c461adff11456734fcb9193b5522cc6451078732).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5355),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5356),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/1c8f783767a680758f2219d2f416ce3ae2fb0c57).
|
||||
Thanks to dependabot and developers of dependencies.
|
||||
- [Small tweaks to moderndark theme](https://github.com/wekan/wekan/pull/5363).
|
||||
Thanks to jghaanstra.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed link at readme](https://github.com/wekan/wekan/pull/5360).
|
||||
Thanks to dyercode.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.41 2024-03-18 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- Fixes for mongosh to allow snap packages to update to the edge/candidate version.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5349),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5350).
|
||||
Thanks to lorodoes.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.40 2024-03-17 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed centering of text below custom login logo](https://github.com/wekan/wekan/commit/24c89aeb64cf6266d95f42124419d4f070864631).
|
||||
Thanks to xet7.
|
||||
- [Fixed In RTL, hamburger margin is too much in mobile](https://github.com/wekan/wekan/commit/583fca1814d916490b04947ba8d97dd85168fb22).
|
||||
Thanks to mohammadZahedian and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.39 2024-03-16 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- Clarify usage of api.py.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5341).
|
||||
[Part 2](https://github.com/wekan/wekan/commit/8f3c948614df0641b0971d1882cc241587d9d3b4).
|
||||
Thanks to e-gaulue and xet7.
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5343),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5344).
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Make the contents of the cards grow to the list width](https://github.com/wekan/wekan/pull/5346).
|
||||
Thanks to kuba-orlik.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.38 2024-03-10 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added docs wikis to WeKan repo directory docs, to make possible to send PRs](https://github.com/wekan/wekan/commit/73ae73d4c38640e9daedbe8ef9e5b25b877ee804).
|
||||
Thanks to e-gaulue, C0rn3j and xet7.
|
||||
- [Added script to count lines of code changed per committer email address, because GitHub removed that feature from web UI](https://github.com/wekan/wekan/commit/835e33bf090022875f50916412f80b6a9b4a3b21).
|
||||
Thanks to bgwines and xet7.
|
||||
- [Add info about GitHub top committers at Finland](https://github.com/wekan/wekan/commit/ef5b8887799a75ab797655f39483bc08841815d2).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated contributing to wiki](https://github.com/wekan/wekan/commit/8ba3a05648818f6162b2021affeb33066f91c400).
|
||||
Thanks to xet7.
|
||||
- [Upgraded to MongoDB 6.0.14 at Snap Candidate](https://github.com/wekan/wekan/commit/07d6c1e5148eb0392357d55d0486a9672378c16f).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and tried to fix the following bugs:
|
||||
|
||||
- [Fix error during delete](https://github.com/wekan/wekan/pull/5336).
|
||||
Thanks to xator91.
|
||||
- [Fixed text below custom login logo not visible](https://github.com/wekan/wekan/commit/00bbc2669814247c0ff79bd816be7bf34bcf08a2).
|
||||
Thanks to xet7.
|
||||
- [Fixed In RTL, hamburger needs margin](https://github.com/wekan/wekan/commit/abd3c95dfa13cd697ff2fb7e299c85287406772a).
|
||||
Thanks to mohammadZahedian and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.37 2024-03-07 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fixed API get swimlane cards wrong order. Please test](https://github.com/wekan/wekan/commit/7beced1e683c2eb2960b0ee40d5ec927d235fa6a).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
- [Fixed API get_all_cards doesn't return SwimlaneId. Please test](https://github.com/wekan/wekan/commit/ffafb30b9b394188e1b60ec836ad83f1738c266d).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.36 2024-03-06 WeKan ® release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [api.py: checklistid, checklistinfo, get_list_cards_count and get_board_cards_count](https://github.com/wekan/wekan/pull/5326).
|
||||
Thanks to xator91.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Card image cover should be margin-top:6px since hamburger menu and due date at the top](https://github.com/wekan/wekan/commit/747bc4c08837ad9781d63b9f16b97a64b0bfe7b8).
|
||||
Thanks to e-gaulue and xet7.
|
||||
- [Try to fix API get cards wrong order. Please test](https://github.com/wekan/wekan/commit/c570405d0267e28f2b2644005d48fb097eac385b).
|
||||
Thanks to mohammadZahedian, xator91 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.35 2024-02-27 WeKan ® release
|
||||
|
||||
This release adds the following features and bugs:
|
||||
|
||||
- [Added back Mathjax that has bug of showing math twice](https://github.com/wekan/wekan/commit/f43dadc06894d874281ec0e449dcc4c81b3c59ad).
|
||||
Thanks to macthecadillac, Dexus and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.34 2024-02-23 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated translations](https://github.com/wekan/wekan/commit/3cd5d00b0b8d74acb2cd2afbc12f5b9d7aafcbd8).
|
||||
Thanks to translators.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.33 2024-02-23 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated docs for previous version of WeKan](https://github.com/wekan/wekan/commit/3b0616c1500b5070e660d2ba00968d59600958eb).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [OpenAPI: Fix breakage introduced with blank return](https://github.com/wekan/wekan/pull/5321).
|
||||
Thanks to bentiss.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.32 2024-02-22 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [api.py: Added create label](https://github.com/wekan/wekan/pull/5308).
|
||||
Thanks to xator91.
|
||||
- [api.py: Edit card color](https://github.com/wekan/wekan/pull/5309).
|
||||
Thanks to xator91.
|
||||
- [api.py: Add checklist with multiple items also or just title](https://github.com/wekan/wekan/pull/5311).
|
||||
Thanks to xator91.
|
||||
- [api.py: Delete all cards. Will delete all cards from Swimlanes automatically, will retrieve automatically all list id and delete everything](https://github.com/wekan/wekan/pull/5313).
|
||||
Thanks to xator91.
|
||||
- [cards.js: Added a control to check error if card is not updated](https://github.com/wekan/wekan/pull/5312).
|
||||
Thanks to xator91.
|
||||
- [Shortcut a to filter by assignees](https://github.com/wekan/wekan/pull/5318).
|
||||
Thanks to DevOpsNB.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Error 500 when adding user to a board and multiple same avatar icons by reverting back from Meteor 2.15 to 2.14](https://github.com/wekan/wekan/commit/b5f4be36d4577c391ad19c5e5dd9de3036b8998f).
|
||||
Thanks to xator91, mariogalan, bbyszio, zeo101, laurentm255, johnnytolengo and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.31 2024-02-17 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [api.py: Added getcard and cardsbyswimlane](https://github.com/wekan/wekan/pull/5287).
|
||||
Thanks to xator91.
|
||||
- [api.py: Add card with label and add a label to a card](https://github.com/wekan/wekan/pull/5290).
|
||||
Thanks to xator91.
|
||||
- [api.py: Fix BoardID to SwimlaneID in cardsbyswimlane](https://github.com/wekan/wekan/pull/5290).
|
||||
Thanks to xator91.
|
||||
- [boards.js: New update board title function for API](https://github.com/wekan/wekan/pull/5300).
|
||||
Thanks to xator91.
|
||||
- [api.py: EDIT BOARD TITLE](https://github.com/wekan/wekan/pull/5301).
|
||||
Thanks to xator91.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Release scripts: Commented out not currently in use builds of WeKan bundle](https://github.com/wekan/wekan/commit/4eb0085243672071a392dc32f77dba3103c592ab).
|
||||
Thanks to xet7.
|
||||
- [Try to fix Snap](https://github.com/wekan/wekan/commit/a54e52d34bdab02befda7eefad46d16814d2c46e).
|
||||
Thanks to xet7.
|
||||
- [Updated to Meteor 2.15-rc.1 and removed duplicate nodemailer package because of some errors](https://github.com/wekan/wekan/commit/59c42bc1a3a1792a50379be2f9251fce9b45c1a3).
|
||||
Thanks to Meteor developers.
|
||||
- [Updated to Meteor 2.15](https://github.com/wekan/wekan/commit/5198ee997cb43b503fcb2edaf781b0521d8096cd).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.30 2024-01-28 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Back to MongoDB 6.0.13](https://github.com/wekan/wekan/commit/64592d734cfdbe10b48c3aa3ea74e0ba35903976).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.29 2024-01-27 WeKan ® release
|
||||
|
||||
This release removes the following features:
|
||||
|
||||
- [Removed markdown-it-mathjax3](https://github.com/wekan/wekan/commit/19703fed311c894b61e9269cc0b973d0b0275a6a).
|
||||
Thanks to Dexus and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated to Meteor 2.14.1-beta.0](https://github.com/wekan/wekan/commit/28d640afb40f4d7c9070fa514c910fbf7065a724).
|
||||
Thanks to Meteor developers.
|
||||
- [Updated to MongoDB 7.0.5 at Snap Candidate and Docker](https://github.com/wekan/wekan/commit/f624211620c5e42ccdd6f931ba473be62437a62c).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.28 2024-01-23 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added archive option to of Wekan API](https://github.com/wekan/wekan/pull/5265).
|
||||
Thanks to gustavengstrom.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated dependencies.
|
||||
[Part 1](https://github.com/wekan/wekan/pull/5270),
|
||||
[Part 2](https://github.com/wekan/wekan/pull/5271),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/67896adefc4a12a93fed7575f621f8aa924a2ab8).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.27 2024-01-02 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix missing maximize card](https://github.com/wekan/wekan/commit/f10f80f6559a6cdee020d5ca34fd5991e07617cf).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.26 2024-01-02 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
-[Fix some public board buttons](https://github.com/wekan/wekan/commit/8ae47cb2f82bcc2078cc9c9987f7d7b7f6394493).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.25 2023-12-30 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Snap: Organized file locations](https://github.com/wekan/wekan/commit/84a228fc1a7ced2b8b146795acc13eb5abb13d24).
|
||||
Thanks to xet7.
|
||||
- Updated GitHub Actions.
|
||||
[Part 1](https://github.com/wekan/wekan/pulls/5243),
|
||||
[Part 2](https://github.com/wekan/wekan/pulls/5244),
|
||||
[Part 3](https://github.com/wekan/wekan/pulls/5245).
|
||||
- [Updated percolate:synced-cron](https://github.com/wekan/wekan/commit/06397e9e11a689a0a2e6a95ae785749d5a6a695b).
|
||||
Thanks to developers of percolate:synced-cron.
|
||||
- Snap: Added MongoDB 3 binaries for migrating to MongoDB 6.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/805458a7638ff6213929bfa70a46b5afeacaedf1),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/335f0451e07d6ff924c0af3e5a934676c8e69f4c),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/374e67310723f3c0d3ab20f6b2e4bd0b273bce2b).
|
||||
Thanks to xet7.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/0e6d83c0852b2da4430f9c902b84c16f5c2ee8bc).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and adds the following translations:
|
||||
|
||||
- [Translations: Added German (Germany) (de_DE) and Odia (India) (or_IN)](https://github.com/wekan/wekan/commit/23c2a2bc224e2def4722a35c20f32a21062b4154).
|
||||
Thanks to translators.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix: Export HTML popup](https://github.com/wekan/wekan/pull/5252).
|
||||
Thanks to Lewiscowles1986.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.24 2023-12-17 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Azure AD B2C login using OAuth2](https://github.com/wekan/wekan/commit/93be112a9454c894c1ce3146ed377e6a6aeca64a).
|
||||
https://github.com/wekan/wekan/wiki/B2C .
|
||||
Thanks to snowsky and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Meteor 2.14](https://github.com/wekan/wekan/commit/75383fe477874a7aaf5caa3b913e2173694efe13).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.23 2023-12-11 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated security.md about mitm](https://github.com/wekan/wekan/commit/b4c9c1df9a7e89d263b1864407a7007338ce770d).
|
||||
Thanks to xet7.
|
||||
- [Upgraded to Meteor 2.14-rc.3](https://github.com/wekan/wekan/commit/6a3b8a668bc84c89714e44c3865168be81c8e2ed).
|
||||
Thanks to Meteor developers.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/e3a0a480ed960d30fc80f7c7c1a6c7471368d0e8).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.22 2023-12-01 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [At right sidebar, moved Minicard Settings to Card Settings popup](https://github.com/wekan/wekan/commit/2f2a039e3c1957b8921f3800315508d4f51c21b7).
|
||||
Thanks to Roemer and xet7.
|
||||
- [New feature: Sidebar / Card Settings / Creator at minicard](https://github.com/wekan/wekan/commit/f3242869110738210b712761dda67fec34932307).
|
||||
Thanks to Roemer and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgraded to MongoDB 6.0.12 at Snap Candidate](https://github.com/wekan/wekan/commit/31ca78c17b0c734087cef99d481b939ac9533612).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed Markdown and copy buttons on top of text](https://github.com/wekan/wekan/commit/3cc10c77f99db344d0af3d6d862eb05c909fbf2c).
|
||||
Thanks to mueller-ma and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.21 2023-11-27 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/fef0c0e490ef0d90b6504074312bf827ff5f2d61).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.20 2023-11-26 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Added standard for public code assessment](https://github.com/wekan/wekan/commit/a307bfa1ec82b66d97714bff32d4201aa8e6e6f7).
|
||||
Thanks to those that participated to making of assessment.
|
||||
- [Upgraded to Meteor 2.14-beta.2](https://github.com/wekan/wekan/commit/126ddda45d07769f9fef67aa74241c9afa04b6a8).
|
||||
Thanks to Meteor developers.
|
||||
- [Upgraded to Meteor 2.14-beta.4](https://github.com/wekan/wekan/commit/d90ab03bbe9f13d211aaca2e72542386fdf2a6ba).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.19 2023-11-20 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Updated swimlane (restore and changed title) and board (changed title) webhooks](https://github.com/wekan/wekan/pull/5205).
|
||||
Thanks to gustavengstrom.
|
||||
- When user logins, "Automatically add user with the domain name" (at Admin Panel / Organizations) to Organization. In Progress.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/6e2f84673e98abec07a10c843ab83bed50774b35),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/9bc63669933bd763930add22ad7d05d89566d3ee).
|
||||
Thanks to xet7.
|
||||
- [Permissions for default board after OIDC/OAuth2 login](https://github.com/wekan/wekan/pull/5213).
|
||||
Thanks to diegosteiner.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Added governance.md](https://github.com/wekan/wekan/commit/2b1d2222cc900e8c815c30a4d07c897e30ba3636).
|
||||
Thanks to xet7.
|
||||
- Updated contributing.md.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/d840cb3be7b1788a4dbdd09ef45690afcf6b3dd4),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/e91e68c48c6392814fbc1362b7ae15ead34e7e47),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/026236edc962a8fc3863b9a4f7dc1d1f5dec3b5c),
|
||||
[Part 4](https://github.com/wekan/wekan/commit/59874d16b9cf95ff05d92dd4d3bbdcb42fd37a94).
|
||||
- [Updated security.md](https://github.com/wekan/wekan/commit/f047c6da295c4ab5ddc6d4d0a8137f419d8704d5).
|
||||
- Updated code of conduct.md.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/c4293ecd95b9faec846060bcbcb8362cb58a54e6),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/f512047ac6439e53f92359f45ab907c629d225a9).
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Removed console.log](https://github.com/wekan/wekan/commit/0c54c1540c494bb7ffeb61a89cbc9a79c8f05d19).
|
||||
Thanks to xet7.
|
||||
- [Fix typos at oidc_server.js](https://github.com/wekan/wekan/commit/cd51ad75086950f29adf245b6d6c0b43e69da171).
|
||||
Thanks to xet7.
|
||||
- [Fix to not anymore show confusing Organization Id and Team Id fields at Admin Panel / People / People / Edit user](https://github.com/wekan/wekan/commit/6405c35bc08fc73657a4111c6fd72a8bd72ded70).
|
||||
Thanks to xet7.
|
||||
- [Fix to not anymore require website for Organization and Team](https://github.com/wekan/wekan/commit/d4d6a5f96d88a89eb47ee56ba9857e859203a53c).
|
||||
Thanks to xet7.
|
||||
- [Snap: Disable apparmor="DENIED" in syslog](https://github.com/wekan/wekan/commit/2048975e92152bb1c397b61fc2fd0a8124fade58).
|
||||
Thanks to diegargon, webenefits and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.18 2023-11-14 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added restore list and changing list title to outgoing webhooks](https://github.com/wekan/wekan/pull/5198).
|
||||
Thanks to gustavengstrom.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated release scripts](https://github.com/wekan/wekan/commit/d4252f30567665897c6314b578dff1fe294265de).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Add Docker label org.opencontainers.image.source](https://github.com/wekan/wekan/pull/5196).
|
||||
Thanks to mueller-ma.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.17 2023-11-09 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix move card rule on checklist complete doesn't work, with ReactiveMiniMongoIndex for Server-Side](https://github.com/wekan/wekan/pull/5194).
|
||||
Thanks to mfilser.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.16 2023-11-09 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix users.save is not a function](https://github.com/wekan/wekan/commit/42ece21fa14113a28792bf97dfd899a064f0ea56).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.15 2023-11-09 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Fix missing profile/avatar pictures](https://github.com/wekan/wekan/commit/4e97a5351a4ac715d21503a129f12fe5bf3f4016).
|
||||
Thanks to kovacs-andras and xet7.
|
||||
- [Commented out links at My Cards Table, because they unexpectly caused to go elsewhere from current view](https://github.com/wekan/wekan/commit/2c36fe3d45a0f95f8ba18526ffd1dc230f6f46a8).
|
||||
Thanks to xet7.
|
||||
- [Add more Docker Labels to Dockerfile](https://github.com/wekan/wekan/commit/52e76c5496b6621916b61f35d5b68687685e0809).
|
||||
Thanks to mueller-ma and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.14 2023-11-09 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Upgraded to Meteor 2.14-beta.0](https://github.com/wekan/wekan/commit/55903472aae0032a49f03529cc9013007a20475e).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Removed double edit text from card description](https://github.com/wekan/wekan/commit/972981a57997fdaeb5202a3c588cd9eb83516360).
|
||||
Thanks to derbolle and xet7.
|
||||
- [Fix Notifications are identical until one is marked read](https://github.com/wekan/wekan/pull/5189).
|
||||
Thanks to mfilser.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.12 2023-11-02 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Code of Conduct
|
||||
|
||||
For all code at WeKan GitHub Organization https://github.com/wekan
|
||||
|
||||
- All code in pull requests need to have permission already to add it to WeKan with MIT license, and will become MIT license.
|
||||
- All code xet7 add is MIT license.
|
||||
- For any dependencies, permissive licenses like https://copyfree.org are preferred
|
||||
- For anything currently that is non-permissive (like GPL, AGPL, SSPL), those will be replaced with permissive-licensed alternatives
|
||||
|
||||
# Reporting about violations or something else
|
||||
|
||||
## Private reports
|
||||
|
||||
- Email support (at) wekan.team using [this PGP public key](support-at-wekan.team_pgp-publickey.asc) if possible
|
||||
- Security issues: [SECURITY.md](SECURITY.md)
|
||||
- License violations
|
||||
- Anything private, sensitive or negative
|
||||
|
||||
## Public
|
||||
|
||||
- Feature Requests and Bug Reports https://github.com/wekan/wekan/issues
|
||||
- Anything happy, positive, encouraging, helping, at friendly WeKan Global FOSS Community
|
||||
+28
-14
@@ -1,3 +1,23 @@
|
||||
## About money
|
||||
|
||||
Not paid:
|
||||
|
||||
- Money is not paid for these, everyone uses their own time at their own cost:
|
||||
- Security reports, see [SECURITY.md](SECURITY.md)
|
||||
- Pull requests
|
||||
- xet7 checking pull requests
|
||||
- Public Community Support
|
||||
- https://github.com/wekan/wekan/issues
|
||||
|
||||
Paid by customers of WeKan Team:
|
||||
|
||||
- Commercial Support at https://wekan.team/commercial-support/
|
||||
- Support
|
||||
- Private Chat
|
||||
- Features
|
||||
- Fixes
|
||||
- Hosting
|
||||
|
||||
## Contributing Security related
|
||||
|
||||
For responsible security disclosure, please follow this process:
|
||||
@@ -7,13 +27,9 @@ CVE Hall of Fame is at https://wekan.github.io/hall-of-fame/
|
||||
|
||||
## Contributing to Documentation Wiki
|
||||
|
||||
Please clone wiki:
|
||||
```
|
||||
git clone https://github.com/wekan/wekan.wiki
|
||||
```
|
||||
Edit .md files, and add changed files in .zip attachment
|
||||
directly to comment of new issue at
|
||||
https://github.com/wekan/wekan/issues
|
||||
Fork WeKan repo https://github.com/wekan/wekan ,
|
||||
edit `docs` directory content at GitHub web interface,
|
||||
and click send PR.
|
||||
|
||||
## Contributing code
|
||||
|
||||
@@ -42,7 +58,7 @@ About 300 persons have contributed to WeKan, stats at:
|
||||
|
||||
https://www.openhub.net/p/wekan
|
||||
|
||||
WeKan maintainer xet7 checks PR for typos etc before accepting to WeKan,
|
||||
WeKan maintainer xet7 reviews PR for typos etc before accepting to WeKan,
|
||||
so that WeKan code will still work OK.
|
||||
|
||||
## Contributing translations
|
||||
@@ -62,12 +78,10 @@ new release.
|
||||
|
||||
## About WeKan Organization https://github.com/wekan
|
||||
|
||||
xet7 rarely adds any new members to GitHub Organization,
|
||||
because xet7 prefers to check PRs.
|
||||
Only xet7 has write access to WeKan Organization.
|
||||
|
||||
For some repos (other than https://github.com/wekan/wekan ),
|
||||
some contributors have direct commit access.
|
||||
xet7 reviews all PRs before merging.
|
||||
|
||||
Some contributors are mentioned at this outdated page:
|
||||
There has been over 300 contributors to WeKan, newest stats at:
|
||||
|
||||
https://github.com/wekan/wekan/wiki/Team
|
||||
https://www.openhub.net/p/wekan
|
||||
+99
-104
@@ -1,10 +1,8 @@
|
||||
FROM --platform=linux/amd64 ubuntu:23.10 as wekan
|
||||
FROM ubuntu:24.04
|
||||
LABEL maintainer="wekan"
|
||||
|
||||
# 2022-09-04:
|
||||
# - above "--platform=linux/amd64 ubuntu:22.04 as wekan" is needed to build Dockerfile
|
||||
# correctly on Mac M1 etc, to not get this error:
|
||||
# https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direc
|
||||
LABEL org.opencontainers.image.ref.name="ubuntu"
|
||||
LABEL org.opencontainers.image.version="24.04"
|
||||
LABEL org.opencontainers.image.source="https://github.com/wekan/wekan"
|
||||
|
||||
# 2022-04-25:
|
||||
# - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
|
||||
@@ -13,19 +11,17 @@ LABEL maintainer="wekan"
|
||||
# 2021-09-18:
|
||||
# - Above Ubuntu base image copied from Docker Hub ubuntu:hirsute-20210825
|
||||
# to Quay to avoid Docker Hub rate limits.
|
||||
|
||||
# Set the environment variables (defaults where required)
|
||||
# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
# ENV BUILD_DEPS="paxctl"
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
|
||||
ENV BUILD_DEPS="apt-utils gnupg gosu wget bzip2 g++ curl libarchive-tools build-essential git ca-certificates python3"
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.21.4 \
|
||||
METEOR_RELEASE=METEOR@2.13.3 \
|
||||
METEOR_RELEASE=METEOR@2.14 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=9.8.1 \
|
||||
NPM_VERSION=6.14.17 \
|
||||
FIBERS_VERSION=4.0.1 \
|
||||
ARCHITECTURE=linux-x64 \
|
||||
SRC_PATH=./ \
|
||||
@@ -66,6 +62,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
OIDC_REDIRECTION_ENABLED=false \
|
||||
OAUTH2_CA_CERT="" \
|
||||
OAUTH2_ADFS_ENABLED=false \
|
||||
OAUTH2_B2C_ENABLED=false \
|
||||
OAUTH2_LOGIN_STYLE=redirect \
|
||||
OAUTH2_CLIENT_ID="" \
|
||||
OAUTH2_SECRET="" \
|
||||
@@ -161,7 +158,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
WRITABLE_PATH=/data \
|
||||
S3=""
|
||||
|
||||
# NODE_OPTIONS="--max_old_space_size=4096" \
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
|
||||
#---------------------------------------------
|
||||
# == at docker-compose.yml: AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
@@ -172,99 +169,98 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
# Copy the app to the image
|
||||
COPY ${SRC_PATH} /home/wekan/app
|
||||
|
||||
RUN \
|
||||
set -o xtrace && \
|
||||
# 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} && \
|
||||
\
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~ && \
|
||||
ln -sf $(which bsdtar) $(which tar) && \
|
||||
\
|
||||
# Download nodejs
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
wget https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt && \
|
||||
#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-${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt | shasum -a 256 -c - && \
|
||||
rm -f SHASUMS256.txt && \
|
||||
#grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
|
||||
#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 && \
|
||||
mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/${NODE_VERSION} /home/wekan/.config && \
|
||||
chown wekan --recursive /home/wekan/.config && \
|
||||
\
|
||||
#DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
#paxctl -mC `which node` && \
|
||||
\
|
||||
# Install Node dependencies. Python path for node-gyp.
|
||||
#npm install -g npm@${NPM_VERSION} && \
|
||||
\
|
||||
# Change user to wekan and install meteor
|
||||
cd /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan && \
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh && \
|
||||
mv /root/.meteor /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan/.meteor && \
|
||||
\
|
||||
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 && \
|
||||
mkdir -p /home/wekan/.npm && \
|
||||
chown wekan --recursive /home/wekan/.npm /home/wekan/.config /home/wekan/.meteor && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan meteor npm install && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan meteor npm install && \
|
||||
cd node_modules/fibers && \
|
||||
node build.js && \
|
||||
cd ../.. && \
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy && \
|
||||
mv /home/wekan/app_build/bundle /build && \
|
||||
\
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar) && \
|
||||
\
|
||||
# Cleanup
|
||||
apt-get remove --purge -y ${BUILD_DEPS} && \
|
||||
apt-get autoremove -y && \
|
||||
npm uninstall -g api2html &&\
|
||||
rm -R /tmp/* && \
|
||||
rm -R /var/lib/apt/lists/* && \
|
||||
rm -R /home/wekan/.meteor && \
|
||||
rm -R /home/wekan/app && \
|
||||
rm -R /home/wekan/app_build && \
|
||||
mkdir /data && \
|
||||
chown wekan --recursive /data
|
||||
#cat /home/wekan/python/esprima-python/files.txt | xargs rm -R && \
|
||||
#rm -R /home/wekan/python
|
||||
#rm /home/wekan/install_meteor.sh
|
||||
# Install OS
|
||||
RUN <<EOR
|
||||
set -o xtrace
|
||||
|
||||
# Add non-root user wekan
|
||||
useradd --user-group --system --home-dir /home/wekan wekan
|
||||
# OS dependencies
|
||||
apt-get update --assume-yes
|
||||
apt-get install --assume-yes --no-install-recommends ${BUILD_DEPS}
|
||||
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
cp $(which tar) $(which tar)~
|
||||
ln -sf $(which bsdtar) $(which tar)
|
||||
|
||||
# Install NodeJS
|
||||
cd /tmp
|
||||
|
||||
# Download nodejs
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz"
|
||||
wget "https://github.com/wekan/node-v14-esm/releases/download/${NODE_VERSION}/SHASUMS256.txt"
|
||||
|
||||
# Verify nodejs authenticity
|
||||
grep "node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz" "SHASUMS256.txt" | shasum -a 256 -c -
|
||||
rm -f "SHASUMS256.txt"
|
||||
|
||||
# Install Node
|
||||
tar xzf "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" -C /usr/local --strip-components=1 --no-same-owner
|
||||
rm "node-$NODE_VERSION-$ARCHITECTURE.tar.gz" "SHASUMS256.txt"
|
||||
ln -s "/usr/local/bin/node" "/usr/local/bin/nodejs"
|
||||
mkdir -p "/opt/nodejs/lib/node_modules/fibers/.node-gyp" "/root/.node-gyp/${NODE_VERSION} /home/wekan/.config"
|
||||
|
||||
# Install node dependencies
|
||||
npm install -g npm@${NPM_VERSION} --production
|
||||
chown --recursive wekan:wekan /home/wekan/.config
|
||||
|
||||
# Install Meteor
|
||||
cd /home/wekan
|
||||
chown --recursive wekan:wekan /home/wekan
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n"
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh
|
||||
mv /root/.meteor /home/wekan/
|
||||
chown --recursive wekan:wekan /home/wekan/.meteor
|
||||
|
||||
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 (Production)
|
||||
cd /home/wekan/app
|
||||
mkdir -p /home/wekan/.npm
|
||||
chown --recursive wekan:wekan /home/wekan/.npm
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install --production
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build
|
||||
cd /home/wekan/app_build/bundle/programs/server/
|
||||
chmod u+w *.json
|
||||
gosu wekan:wekan meteor npm install --production
|
||||
cd node_modules/fibers
|
||||
node build.js
|
||||
cd ../..
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy
|
||||
mv /home/wekan/app_build/bundle /build
|
||||
|
||||
# Put back the original tar
|
||||
mv $(which tar)~ $(which tar)
|
||||
|
||||
# Cleanup
|
||||
apt-get remove --purge --assume-yes ${BUILD_DEPS}
|
||||
npm uninstall -g api2html
|
||||
apt-get autoremove --assume-yes
|
||||
apt-get clean --assume-yes
|
||||
rm -Rf /tmp/*
|
||||
rm -Rf /var/lib/apt/lists/*
|
||||
rm -Rf /var/cache/apt
|
||||
rm -Rf /var/lib/apt/lists
|
||||
rm -Rf /home/wekan/app_build
|
||||
rm -Rf /home/wekan/app
|
||||
rm -Rf /home/wekan/.meteor
|
||||
|
||||
mkdir /data
|
||||
chown wekan --recursive /data
|
||||
EOR
|
||||
|
||||
USER wekan
|
||||
|
||||
ENV PORT=8080
|
||||
EXPOSE $PORT
|
||||
USER wekan
|
||||
|
||||
STOPSIGNAL SIGKILL
|
||||
WORKDIR /home/wekan/app
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
@@ -275,6 +271,5 @@ STOPSIGNAL SIGKILL
|
||||
#---------------------------------------------------------------------
|
||||
#
|
||||
# CMD ["node", "/build/main.js"]
|
||||
|
||||
#CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
# CMD ["bash", "-c", "ulimit -s 65500; exec node --stack-size=65500 /build/main.js"]
|
||||
CMD ["bash", "-c", "ulimit -s 65500; exec node /build/main.js"]
|
||||
@@ -0,0 +1,40 @@
|
||||
# Future
|
||||
|
||||
## Moved Import/Export/Sync issues to Big Picture Roadmap wiki page
|
||||
|
||||
This change is limited to only Import/Export/Sync issues, while those are In Progress of being fixed.
|
||||
|
||||
2023-11-21 xet7 closed 261 issues that are linked at https://github.com/wekan/wekan/wiki/Sync ,
|
||||
that is Roadmap of Import/Export/Sync in WeKan. It means, that those issues progress will be
|
||||
updated at that wiki page, when xet7 and other WeKan contributors fix those.
|
||||
Many of those issues are In Progress of being fixed and added.
|
||||
|
||||
## Platform Updates
|
||||
|
||||
Issues related to platforms are being closed, because only list of working platforms is mentioned now
|
||||
at WeKan website https://wekan.github.io Install section and at [ChangeLog](https://github.com/wekan/wekan/blob/main/CHANGELOG.md)
|
||||
where is this new text:
|
||||
|
||||
> Newest WeKan at amd64 platforms: Linux bundle, Snap Candidate, Docker, Kubernetes. Fixing other platforms In Progress.
|
||||
|
||||
Platform support changes often, because:
|
||||
|
||||
- There are many dependencies, that update or break or change often
|
||||
- Node.js segfaults at some CPU/OS
|
||||
- Some platforms have build errors
|
||||
|
||||
Roadmap is to update all existing platforms, and add more platforms.
|
||||
|
||||
Upcoming platform upgrades:
|
||||
|
||||
- Fix migrations, so that newest WeKan can be released to Snap Stable. (Currently newest is at Snap Candidate).
|
||||
|
||||
## WeKan features
|
||||
|
||||
Most Meteor WeKan features are listed here:
|
||||
|
||||
https://github.com/wekan/wekan/wiki/Deep-Dive-Into-WeKan
|
||||
|
||||
Remaining features and all changes are listed here:
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
@@ -0,0 +1,10 @@
|
||||
# Governance
|
||||
|
||||
Anyone can send pull request to https://github.com/wekan/wekan/wiki/pulls ,
|
||||
if there is permission to add code to WeKan with MIT license.
|
||||
|
||||
As maintainer, xet7 checks all pull requests and merges them.
|
||||
|
||||
Only xet7 has write access to repo https://github.com/wekan/wekan
|
||||
|
||||
|
||||
@@ -2,23 +2,34 @@
|
||||
|
||||
# WeKan ® - Open Source kanban
|
||||
|
||||
## Downloads
|
||||
|
||||
https://wekan.github.io / Install WeKan ® Server
|
||||
|
||||
## Docker Containers
|
||||
|
||||
- [GitHub](https://github.com/wekan/wekan/pkgs/container/wekan)
|
||||
- [Quay](https://quay.io/repository/wekan/wekan)
|
||||
- [Docker Hub](https://hub.docker.com/r/wekanteam/wekan)
|
||||
|
||||
Other platforms and compatible software versions at https://wekan.github.io Download section.
|
||||
docker-compose.yml at https://github.com/wekan/wekan/blob/main/docker-compose.yml
|
||||
|
||||
## Standards
|
||||
|
||||
- [WeKan and Standard for Public Code](https://wekan.github.io/standard-for-public-code/) assessment was made at 2023-11.
|
||||
Currently Wekan meets 8 out of 16 criteria out of the box.
|
||||
Some others could be met with small changes.
|
||||
|
||||
## Code stats
|
||||
|
||||
- [CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4619)
|
||||
- [Code Climate](https://codeclimate.com/github/wekan/wekan)
|
||||
- [Open Hub](https://www.openhub.net/p/wekan)
|
||||
- [OSS Insight](https://ossinsight.io/analyze/wekan/wekan)
|
||||
- [CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/4619)
|
||||
|
||||
## [Translate WeKan ® at Transifex](https://app.transifex.com/wekan/)
|
||||
|
||||
Translations to non-English languages are accepted only at [Transifex](https://app.transifex.com/wekan/) using webbrowser.
|
||||
Translations to non-English languages are accepted only at [Transifex](https://app.transifex.com/wekan/wekan) using webbrowser.
|
||||
New English strings of new features can be added as PRs to master branch file wekan/imports/i18n/data/en.i18n.json .
|
||||
|
||||
## [WeKan ® feature requests and bugs](https://github.com/wekan/wekan/issues)
|
||||
|
||||
+4
-3
@@ -1,6 +1,7 @@
|
||||
About money, see [CONTRIBUTING.md](CONTRIBUTING.md)
|
||||
|
||||
Security is very important to us. If you discover any issue regarding security, please disclose
|
||||
the information responsibly by sending an email to support (at) wekan.team using
|
||||
[this PGP public key](support-at-wekan.team_pgp-publickey.asc) and not by
|
||||
the information responsibly by sending an email to support@wekan.team and not by
|
||||
creating a GitHub issue. We will respond swiftly to fix verifiable security issues.
|
||||
|
||||
We thank you with a place at our hall of fame page, that is
|
||||
@@ -58,7 +59,7 @@ and by by companies that have 30k users.
|
||||
## SSL/TLS
|
||||
|
||||
- SSL/TLS encrypts traffic between webbrowser and webserver.
|
||||
- If you are thinking about TLS MITM, look at Caddy 2 webserver MITM detections.
|
||||
- If you are thinking about TLS MITM, look at https://github.com/caddyserver/caddy/issues/2530
|
||||
- Let's Encrypt TLS requires publicly accessible webserver, that Let's Encrypt TLS validation servers check.
|
||||
- If firewall limits to only allowed IP addresses, you may need non-Let's Encrypt TLS cert.
|
||||
- For On Premise:
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v7.12.0"
|
||||
appVersion: "v7.55.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -37,9 +37,24 @@ If *nix: chmod +x api.py => ./api.py users
|
||||
python3 api.py customfields BOARDID # Custom Fields of BOARDID
|
||||
python3 api.py customfield BOARDID CUSTOMFIELDID # Info of CUSTOMFIELDID
|
||||
python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE # Edit Custom Field
|
||||
python3 api.py listattachments BOARDID # List attachments
|
||||
python3 api.py cardsbyswimlane SWIMLANEID LISTID # Retrieve cards list on a swimlane
|
||||
python3 api.py getcard BOARDID LISTID CARDID # Get card info
|
||||
python3 api.py addlabel BOARDID LISTID CARDID LABELID # Add label to a card
|
||||
python3 api.py addcardwithlabel AUTHORID BOARDID SWIMLANEID LISTID CARDTITLE CARDDESCRIPTION LABELIDS # Add a card and a label
|
||||
python3 api.py editboardtitle BOARDID NEWBOARDTITLE # Edit board title
|
||||
python3 api.py copyboard BOARDID NEWBOARDTITLE # Copy a board
|
||||
python3 api.py createlabel BOARDID LABELCOLOR LABELNAME (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`) # Create a new label
|
||||
python3 api.py editcardcolor BOARDID LISTID CARDID COLOR (Color available: `white`, `green`, `yellow`, `orange`, `red`, `purple`, `blue`, `sky`, `lime`, `pink`, `black`, `silver`, `peachpuff`, `crimson`, `plum`, `darkgreen`, `slateblue`, `magenta`, `gold`, `navy`, `gray`, `saddlebrown`, `paleturquoise`, `mistyrose`, `indigo`) # Edit card color
|
||||
python3 api.py addchecklist BOARDID CARDID TITLE ITEM1 ITEM2 ITEM3 ITEM4 (You can add multiple items or just one, or also without any item, just TITLE works as well. * If items or Title contains spaces, you should add ' between them.) # Add checklist + item on a card
|
||||
python3 api.py deleteallcards BOARDID SWIMLANEID ( * Be careful will delete ALL CARDS INSIDE the swimlanes automatically in every list * ) # Delete all cards on a swimlane
|
||||
python3 api.py checklistid BOARDID CARDID # Retrieve Checklist ID attached to a card
|
||||
python3 api.py checklistinfo BOARDID CARDID CHECKLISTID # Get checklist info
|
||||
python3 api.py get_list_cards_count BOARDID LISTID # Retrieve how many cards in a list
|
||||
python3 api.py get_board_cards_count BOARDID # Retrieve how many cards in a board
|
||||
|
||||
|
||||
Admin API:
|
||||
python3 api.py users # All users
|
||||
python3 api.py boards # All Public Boards
|
||||
@@ -179,6 +194,52 @@ if arguments == 10:
|
||||
print(body.text)
|
||||
# ------- ADD CUSTOM FIELD TO BOARD END -----------
|
||||
|
||||
if arguments == 8:
|
||||
|
||||
if sys.argv[1] == 'addcardwithlabel':
|
||||
# ------- ADD CARD WITH LABEL START -----------
|
||||
authorid = sys.argv[2]
|
||||
boardid = sys.argv[3]
|
||||
swimlaneid = sys.argv[4]
|
||||
listid = sys.argv[5]
|
||||
cardtitle = sys.argv[6]
|
||||
carddescription = sys.argv[7]
|
||||
labelIds = sys.argv[8] # Aggiunto labelIds
|
||||
|
||||
cardtolist = wekanurl + apiboards + boardid + s + l + s + listid + s + cs
|
||||
# Add card
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
post_data = {
|
||||
'authorId': '{}'.format(authorid),
|
||||
'title': '{}'.format(cardtitle),
|
||||
'description': '{}'.format(carddescription),
|
||||
'swimlaneId': '{}'.format(swimlaneid),
|
||||
'labelIds': labelIds
|
||||
}
|
||||
|
||||
body = requests.post(cardtolist, data=post_data, headers=headers)
|
||||
print(body.text)
|
||||
|
||||
# If ok id card
|
||||
if body.status_code == 200:
|
||||
card_data = body.json()
|
||||
new_card_id = card_data.get('_id')
|
||||
|
||||
# Updating card
|
||||
if new_card_id:
|
||||
edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + new_card_id
|
||||
put_data = {'labelIds': labelIds}
|
||||
body = requests.put(edcard, data=put_data, headers=headers)
|
||||
print("=== EDIT CARD ===\n")
|
||||
body = requests.get(edcard, headers=headers)
|
||||
data2 = body.text.replace('}', "}\n")
|
||||
print(data2)
|
||||
else:
|
||||
print("Error obraining ID.")
|
||||
else:
|
||||
print("Error adding card.")
|
||||
# ------- ADD CARD WITH LABEL END -----------
|
||||
|
||||
if arguments == 7:
|
||||
|
||||
if sys.argv[1] == 'addcard':
|
||||
@@ -237,7 +298,53 @@ if arguments == 6:
|
||||
print(data2)
|
||||
# ------- EDIT CUSTOMFIELD END -----------
|
||||
|
||||
if arguments == 4:
|
||||
if arguments == 5:
|
||||
|
||||
if sys.argv[1] == 'addlabel':
|
||||
|
||||
# ------- EDIT CARD ADD LABEL START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
cardid = sys.argv[4]
|
||||
labelIds = sys.argv[5]
|
||||
edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
|
||||
print(edcard)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
put_data = {'labelIds': labelIds}
|
||||
body = requests.put(edcard, data=put_data, headers=headers)
|
||||
print("=== ADD LABEL ===\n")
|
||||
body = requests.get(edcard, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
# ------- EDIT CARD ADD LABEL END -----------
|
||||
|
||||
if sys.argv[1] == 'editcardcolor':
|
||||
# ------- EDIT CARD COLOR START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
cardid = sys.argv[4]
|
||||
newcolor = sys.argv[5]
|
||||
|
||||
valid_colors = ['white', 'green', 'yellow', 'orange', 'red', 'purple', 'blue', 'sky', 'lime', 'pink', 'black',
|
||||
'silver', 'peachpuff', 'crimson', 'plum', 'darkgreen', 'slateblue', 'magenta', 'gold', 'navy',
|
||||
'gray', 'saddlebrown', 'paleturquoise', 'mistyrose', 'indigo']
|
||||
|
||||
if newcolor not in valid_colors:
|
||||
print("Invalid color. Choose a color from the list.")
|
||||
sys.exit(1)
|
||||
|
||||
edcard = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
|
||||
print(edcard)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
put_data = {'color': '{}'.format(newcolor)}
|
||||
body = requests.put(edcard, data=put_data, headers=headers)
|
||||
print("=== EDIT CARD COLOR ===\n")
|
||||
body = requests.get(edcard, headers=headers)
|
||||
data2 = body.text.replace('}', "}\n")
|
||||
print(data2)
|
||||
# ------- EDIT CARD COLOR END -----------
|
||||
|
||||
if arguments >= 4:
|
||||
|
||||
if sys.argv[1] == 'newuser':
|
||||
|
||||
@@ -251,9 +358,155 @@ if arguments == 4:
|
||||
print("=== CREATE NEW USER ===\n")
|
||||
print(body.text)
|
||||
# ------- CREATE NEW USER END -----------
|
||||
|
||||
if sys.argv[1] == 'getcard':
|
||||
|
||||
# ------- LIST OF CARD START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
cardid = sys.argv[4]
|
||||
listone = wekanurl + apiboards + boardid + s + l + s + listid + s + cs + s + cardid
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
print("=== INFO OF ONE LIST ===\n")
|
||||
print("URL:", listone) # Stampa l'URL per debug
|
||||
try:
|
||||
response = requests.get(listone, headers=headers)
|
||||
print("=== RESPONSE ===\n")
|
||||
print("Status Code:", response.status_code) # Stampa il codice di stato per debug
|
||||
|
||||
if response.status_code == 200:
|
||||
data2 = response.text.replace('}', "}\n")
|
||||
print(data2)
|
||||
else:
|
||||
print(f"Error: {response.status_code}")
|
||||
print(f"Response: {response.text}")
|
||||
except Exception as e:
|
||||
print(f"Error in the GET request: {e}")
|
||||
# ------- LISTS OF CARD END -----------
|
||||
|
||||
if sys.argv[1] == 'createlabel':
|
||||
|
||||
# ------- CREATE LABEL START -----------
|
||||
boardid = sys.argv[2]
|
||||
labelcolor = sys.argv[3]
|
||||
labelname = sys.argv[4]
|
||||
label_url = wekanurl + apiboards + boardid + s + 'labels'
|
||||
print(label_url)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
# Object to send
|
||||
put_data = {'label': {'color': labelcolor, 'name': labelname}}
|
||||
print("URL:", label_url)
|
||||
print("Headers:", headers)
|
||||
print("Data:", put_data)
|
||||
try:
|
||||
response = requests.put(label_url, json=put_data, headers=headers)
|
||||
print("=== CREATE LABELS ===\n")
|
||||
print("Response Status Code:", response.status_code)
|
||||
print("Response Text:", response.text)
|
||||
except Exception as e:
|
||||
print("Error:", e)
|
||||
# ------- CREATE LABEL END -----------
|
||||
|
||||
if sys.argv[1] == 'addchecklist':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
checklist_title = sys.argv[4]
|
||||
|
||||
# Aggiungi la checklist
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists'
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
data = {'title': checklist_title}
|
||||
|
||||
response = requests.post(checklist_url, data=data, headers=headers)
|
||||
response.raise_for_status()
|
||||
|
||||
result = json.loads(response.text)
|
||||
checklist_id = result.get('_id')
|
||||
|
||||
print(f"Checklist '{checklist_title}' created. ID: {checklist_id}")
|
||||
|
||||
# Aggiungi gli items alla checklist
|
||||
items_to_add = sys.argv[5:]
|
||||
for item_title in items_to_add:
|
||||
checklist_item_url = wekanurl + apiboards + board_id + s + cs + s + card_id + s + 'checklists' + s + checklist_id + '/items'
|
||||
item_data = {'title': item_title}
|
||||
|
||||
item_response = requests.post(checklist_item_url, data=item_data, headers=headers)
|
||||
item_response.raise_for_status()
|
||||
|
||||
item_result = json.loads(item_response.text)
|
||||
checklist_item_id = item_result.get('_id')
|
||||
|
||||
print(f"Item '{item_title}' added. ID: {checklist_item_id}")
|
||||
|
||||
if sys.argv[1] == 'checklistinfo':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
checklist_id = sys.argv[4]
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists' + s + checklist_id
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
response = requests.get(checklist_url, headers=headers)
|
||||
|
||||
response.raise_for_status()
|
||||
|
||||
checklist_info = response.json()
|
||||
print("Checklist Info:")
|
||||
print(checklist_info)
|
||||
|
||||
if arguments == 3:
|
||||
|
||||
if sys.argv[1] == 'editboardtitle':
|
||||
|
||||
# ------- EDIT BOARD TITLE START -----------
|
||||
boardid = sys.argv[2]
|
||||
boardtitle = sys.argv[3]
|
||||
edboardtitle = wekanurl + apiboards + boardid + s + 'title'
|
||||
print(edboardtitle)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
post_data = {'title': boardtitle}
|
||||
|
||||
body = requests.put(edboardtitle, json=post_data, headers=headers)
|
||||
print("=== EDIT BOARD TITLE ===\n")
|
||||
#body = requests.get(edboardtitle, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
if body.status_code == 200:
|
||||
print("Succesfull!")
|
||||
else:
|
||||
print(f"Error: {body.status_code}")
|
||||
print(body.text)
|
||||
|
||||
# ------- EDIT BOARD TITLE END -----------
|
||||
|
||||
if sys.argv[1] == 'copyboard':
|
||||
|
||||
# ------- COPY BOARD START -----------
|
||||
boardid = sys.argv[2]
|
||||
boardtitle = sys.argv[3]
|
||||
edboardcopy = wekanurl + apiboards + boardid + s + 'copy'
|
||||
print(edboardcopy)
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
post_data = {'title': boardtitle}
|
||||
|
||||
body = requests.post(edboardcopy, json=post_data, headers=headers)
|
||||
print("=== COPY BOARD ===\n")
|
||||
#body = requests.get(edboardcopy, headers=headers)
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
if body.status_code == 200:
|
||||
print("Succesfull!")
|
||||
else:
|
||||
print(f"Error: {body.status_code}")
|
||||
print(body.text)
|
||||
|
||||
# ------- COPY BOARD END -----------
|
||||
|
||||
if sys.argv[1] == 'createlist':
|
||||
|
||||
# ------- CREATE LIST START -----------
|
||||
@@ -293,6 +546,90 @@ if arguments == 3:
|
||||
print(data2)
|
||||
# ------- INFO OF CUSTOM FIELD END -----------
|
||||
|
||||
if sys.argv[1] == 'cardsbyswimlane':
|
||||
# ------- RETRIEVE CARDS BY SWIMLANE ID START -----------
|
||||
boardid = sys.argv[2]
|
||||
swimlaneid = sys.argv[3]
|
||||
cardsbyswimlane = wekanurl + apiboards + boardid + s + sws + s + swimlaneid + s + cs
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
print("=== CARDS BY SWIMLANE ID ===\n")
|
||||
print("URL:", cardsbyswimlane) # Debug
|
||||
try:
|
||||
body = requests.get(cardsbyswimlane, headers=headers)
|
||||
print("Status Code:", body.status_code) # Debug
|
||||
data = body.text.replace('}', "}\n")
|
||||
print("Data:", data)
|
||||
except Exception as e:
|
||||
print("Error GET:", e)
|
||||
# ------- RETRIEVE CARDS BY SWIMLANE ID END -----------
|
||||
|
||||
if sys.argv[1] == 'deleteallcards':
|
||||
boardid = sys.argv[2]
|
||||
swimlaneid = sys.argv[3]
|
||||
|
||||
# ------- GET SWIMLANE CARDS START -----------
|
||||
get_swimlane_cards_url = wekanurl + apiboards + boardid + s + "swimlanes" + s + swimlaneid + s + "cards"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_swimlane_cards_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
cards_data = response.json()
|
||||
|
||||
# Print the details of each card
|
||||
for card in cards_data:
|
||||
# ------- DELETE CARD START -----------
|
||||
delete_card_url = wekanurl + apiboards + boardid + s + "lists" + s + card['listId'] + s + "cards" + s + card['_id']
|
||||
try:
|
||||
response = requests.delete(delete_card_url, headers=headers)
|
||||
if response.status_code == 404:
|
||||
print(f"Card not found: {card['_id']}")
|
||||
else:
|
||||
response.raise_for_status()
|
||||
deleted_card_data = response.json()
|
||||
print(f"Card Deleted Successfully. Card ID: {deleted_card_data['_id']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error deleting card: {e}")
|
||||
# ------- DELETE CARD END -----------
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error getting swimlane cards: {e}")
|
||||
sys.exit(1)
|
||||
# ------- GET SWIMLANE CARDS END -----------
|
||||
|
||||
if sys.argv[1] == 'get_list_cards_count':
|
||||
# ------- GET LIST CARDS COUNT START -----------
|
||||
boardid = sys.argv[2]
|
||||
listid = sys.argv[3]
|
||||
|
||||
get_list_cards_count_url = wekanurl + apiboards + boardid + s + l + s + listid + s + "cards_count"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_list_cards_count_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
print(f"List Cards Count: {data['list_cards_count']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: {e}")
|
||||
# ------- GET LIST CARDS COUNT END -----------
|
||||
|
||||
if sys.argv[1] == 'checklistid':
|
||||
|
||||
# ------- ADD CHECKLIST START -----------
|
||||
board_id = sys.argv[2]
|
||||
card_id = sys.argv[3]
|
||||
|
||||
checklist_url = wekanurl + apiboards + board_id + s + cs + s + card_id + '/checklists'
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
response = requests.get(checklist_url, headers=headers)
|
||||
|
||||
response.raise_for_status()
|
||||
checklists = response.json()
|
||||
print("Checklists:")
|
||||
for checklist in checklists:
|
||||
print(checklist)
|
||||
|
||||
if arguments == 2:
|
||||
|
||||
# ------- BOARDS LIST START -----------
|
||||
@@ -364,6 +701,22 @@ if arguments == 2:
|
||||
print(data2)
|
||||
# ------- LISTS OF ATTACHMENTS END -----------
|
||||
|
||||
if sys.argv[1] == 'get_board_cards_count':
|
||||
# ------- GET BOARD CARDS COUNT START -----------
|
||||
boardid = sys.argv[2]
|
||||
|
||||
get_board_cards_count_url = wekanurl + apiboards + boardid + s + "cards_count"
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
|
||||
try:
|
||||
response = requests.get(get_board_cards_count_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
print(f"Board Cards Count: {data['board_cards_count']}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error: {e}")
|
||||
# ------- GET BOARD CARDS COUNT END -----------
|
||||
|
||||
if arguments == 1:
|
||||
|
||||
if sys.argv[1] == 'users':
|
||||
|
||||
@@ -16,7 +16,6 @@ template(name="cardActivities")
|
||||
+activity(activity=activityData card=card mode=mode)
|
||||
|
||||
template(name="editOrDeleteComment")
|
||||
= ' - '
|
||||
a.js-open-inlined-form {{_ "edit"}}
|
||||
= ' - '
|
||||
a.js-delete-comment {{_ "delete"}}
|
||||
@@ -145,11 +144,10 @@ template(name="activity")
|
||||
+viewer
|
||||
= activity.comment.text
|
||||
+commentReactions(reactions=activity.comment.reactions commentId=activity.comment._id)
|
||||
span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
if($eq currentUser._id activity.comment.userId)
|
||||
+editOrDeleteComment
|
||||
else if currentUser.isBoardAdmin
|
||||
+editOrDeleteComment
|
||||
if($eq currentUser._id activity.comment.userId)
|
||||
+editOrDeleteComment
|
||||
else if currentUser.isBoardAdmin
|
||||
+editOrDeleteComment
|
||||
|
||||
if($eq activity.activityType 'deleteComment')
|
||||
| {{{_ 'activity-deleteComment' activity.commentId}}}.
|
||||
@@ -243,4 +241,4 @@ template(name="activity")
|
||||
else if(currentData.timeValue)
|
||||
| {{_ activity.activityType currentData.timeValue}}
|
||||
|
||||
span(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
div(title=activity.createdAt).activity-meta {{ moment activity.createdAt }}
|
||||
@@ -13,39 +13,41 @@ BlazeComponent.extendComponent({
|
||||
const sidebar = Sidebar;
|
||||
sidebar && sidebar.callFirstWith(null, 'resetNextPeak');
|
||||
this.autorun(() => {
|
||||
let mode = this.data().mode;
|
||||
const capitalizedMode = Utils.capitalize(mode);
|
||||
let searchId;
|
||||
if (mode === 'linkedcard' || mode === 'linkedboard') {
|
||||
searchId = Utils.getCurrentCard().linkedId;
|
||||
mode = mode.replace('linked', '');
|
||||
} else if (mode === 'card') {
|
||||
searchId = Utils.getCurrentCardId();
|
||||
} else {
|
||||
searchId = Session.get(`current${capitalizedMode}`);
|
||||
}
|
||||
const limit = this.page.get() * activitiesPerPage;
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
const hideSystem = user ? user.hasHiddenSystemMessages() : false;
|
||||
if (searchId === null) return;
|
||||
|
||||
this.subscribe('activities', mode, searchId, limit, hideSystem, () => {
|
||||
this.loadNextPageLocked = false;
|
||||
|
||||
// TODO the guard can be removed as soon as the TODO above is resolved
|
||||
if (!sidebar) return;
|
||||
// If the sibear peak hasn't increased, that mean that there are no more
|
||||
// activities, and we can stop calling new subscriptions.
|
||||
// XXX This is hacky! We need to know excatly and reactively how many
|
||||
// activities there are, we probably want to denormalize this number
|
||||
// dirrectly into card and board documents.
|
||||
const nextPeakBefore = sidebar.callFirstWith(null, 'getNextPeak');
|
||||
sidebar.calculateNextPeak();
|
||||
const nextPeakAfter = sidebar.callFirstWith(null, 'getNextPeak');
|
||||
if (nextPeakBefore === nextPeakAfter) {
|
||||
sidebar.callFirstWith(null, 'resetNextPeak');
|
||||
let mode = this.data()?.mode;
|
||||
if (mode) {
|
||||
const capitalizedMode = Utils.capitalize(mode);
|
||||
let searchId;
|
||||
if (mode === 'linkedcard' || mode === 'linkedboard') {
|
||||
searchId = Utils.getCurrentCard().linkedId;
|
||||
mode = mode.replace('linked', '');
|
||||
} else if (mode === 'card') {
|
||||
searchId = Utils.getCurrentCardId();
|
||||
} else {
|
||||
searchId = Session.get(`current${capitalizedMode}`);
|
||||
}
|
||||
});
|
||||
const limit = this.page.get() * activitiesPerPage;
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
const hideSystem = user ? user.hasHiddenSystemMessages() : false;
|
||||
if (searchId === null) return;
|
||||
|
||||
this.subscribe('activities', mode, searchId, limit, hideSystem, () => {
|
||||
this.loadNextPageLocked = false;
|
||||
|
||||
// TODO the guard can be removed as soon as the TODO above is resolved
|
||||
if (!sidebar) return;
|
||||
// If the sibear peak hasn't increased, that mean that there are no more
|
||||
// activities, and we can stop calling new subscriptions.
|
||||
// XXX This is hacky! We need to know excatly and reactively how many
|
||||
// activities there are, we probably want to denormalize this number
|
||||
// dirrectly into card and board documents.
|
||||
const nextPeakBefore = sidebar.callFirstWith(null, 'getNextPeak');
|
||||
sidebar.calculateNextPeak();
|
||||
const nextPeakAfter = sidebar.callFirstWith(null, 'getNextPeak');
|
||||
if (nextPeakBefore === nextPeakAfter) {
|
||||
sidebar.callFirstWith(null, 'resetNextPeak');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
loadNextPage() {
|
||||
|
||||
@@ -18,7 +18,7 @@ template(name="boardBody")
|
||||
else
|
||||
.board-wrapper(class=currentBoard.colorClass)
|
||||
+sidebar
|
||||
.board-canvas.js-swimlanes(
|
||||
.board-canvas.js-swimlanes.dragscroll(
|
||||
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}}")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { ReactiveCache } from '/imports/reactiveCache';
|
||||
import { TAPi18n } from '/imports/i18n';
|
||||
import dragscroll from '@wekanteam/dragscroll';
|
||||
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndex } = Utils;
|
||||
@@ -219,6 +220,7 @@ BlazeComponent.extendComponent({
|
||||
boardComponent.openNewListForm();
|
||||
}
|
||||
|
||||
dragscroll.reset();
|
||||
Utils.setBackgroundImage();
|
||||
},
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -12,8 +12,9 @@ template(name="boardHeaderBar")
|
||||
if currentBoard
|
||||
if currentUser
|
||||
with currentBoard
|
||||
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title)
|
||||
i.fa.fa-pencil-square-o
|
||||
if currentUser.isBoardAdmin
|
||||
a.board-header-btn(class="{{#if currentUser.isBoardAdmin}}js-edit-board-title{{else}}is-disabled{{/if}}" title="{{_ 'edit'}}" value=title)
|
||||
i.fa.fa-pencil-square-o
|
||||
|
||||
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'}}")
|
||||
|
||||
@@ -6,37 +6,6 @@ const DOWNCLS = 'fa-sort-down';
|
||||
const UPCLS = 'fa-sort-up';
|
||||
*/
|
||||
const sortCardsBy = new ReactiveVar('');
|
||||
Template.boardMenuPopup.events({
|
||||
'click .js-rename-board': Popup.open('boardChangeTitle'),
|
||||
'click .js-custom-fields'() {
|
||||
Sidebar.setView('customFields');
|
||||
Popup.back();
|
||||
},
|
||||
'click .js-open-archives'() {
|
||||
Sidebar.setView('archives');
|
||||
Popup.back();
|
||||
},
|
||||
'click .js-change-board-color': Popup.open('boardChangeColor'),
|
||||
'click .js-change-language': Popup.open('changeLanguage'),
|
||||
'click .js-archive-board ': Popup.afterConfirm('archiveBoard', function() {
|
||||
const currentBoard = Utils.getCurrentBoard();
|
||||
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-delete-board': Popup.afterConfirm('deleteBoard', function() {
|
||||
const currentBoard = Utils.getCurrentBoard();
|
||||
Popup.back();
|
||||
Boards.remove(currentBoard._id);
|
||||
FlowRouter.go('home');
|
||||
}),
|
||||
'click .js-outgoing-webhooks': Popup.open('outgoingWebhooks'),
|
||||
'click .js-import-board': Popup.open('chooseBoardSource'),
|
||||
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
|
||||
'click .js-card-settings': Popup.open('boardCardSettings'),
|
||||
'click .js-minicard-settings': Popup.open('boardMinicardSettings'),
|
||||
});
|
||||
|
||||
Template.boardChangeTitlePopup.events({
|
||||
submit(event, templateInstance) {
|
||||
|
||||
@@ -151,8 +151,8 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
const currUser = ReactiveCache.getCurrentUser();
|
||||
|
||||
let orgIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
|
||||
if (orgIdsUserBelongs && orgIdsUserBelongs != '') {
|
||||
let orgIdsUserBelongs = currUser?.orgIdsUserBelongs() || '';
|
||||
if (orgIdsUserBelongs) {
|
||||
let orgsIds = orgIdsUserBelongs.split(',');
|
||||
// for(let i = 0; i < orgsIds.length; i++){
|
||||
// query.$and[2].$or.push({'orgs.orgId': orgsIds[i]});
|
||||
@@ -162,8 +162,8 @@ BlazeComponent.extendComponent({
|
||||
query.$and[2].$or.push({ 'orgs.orgId': { $in: orgsIds } });
|
||||
}
|
||||
|
||||
let teamIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
|
||||
if (teamIdsUserBelongs && teamIdsUserBelongs != '') {
|
||||
let teamIdsUserBelongs = currUser?.teamIdsUserBelongs() || '';
|
||||
if (teamIdsUserBelongs) {
|
||||
let teamsIds = teamIdsUserBelongs.split(',');
|
||||
// for(let i = 0; i < teamsIds.length; i++){
|
||||
// query.$or[2].$or.push({'teams.teamId': teamsIds[i]});
|
||||
@@ -199,15 +199,12 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
boardMembers(boardId) {
|
||||
let boardMembers = [];
|
||||
/* Bug Board icons random dance https://github.com/wekan/wekan/issues/4214
|
||||
const lists = ReactiveCache.getBoard(boardId)
|
||||
let members = lists.members
|
||||
members.forEach(member => {
|
||||
boardMembers.push(member.userId);
|
||||
});
|
||||
*/
|
||||
const boardMembers = lists?.members.map(member => member.userId);
|
||||
return boardMembers;
|
||||
*/
|
||||
return [];
|
||||
},
|
||||
|
||||
isStarred() {
|
||||
|
||||
@@ -51,8 +51,9 @@ template(name="attachmentGallery")
|
||||
|
||||
.attachment-gallery
|
||||
|
||||
a.attachment-item.add-attachment.js-add-attachment
|
||||
i.fa.fa-plus.icon
|
||||
if canModifyCard
|
||||
a.attachment-item.add-attachment.js-add-attachment
|
||||
i.fa.fa-plus.icon
|
||||
|
||||
each attachments
|
||||
|
||||
@@ -116,8 +117,6 @@ template(name="attachmentActionsPopup")
|
||||
| {{_ 'remove-background-image'}}
|
||||
else
|
||||
| {{_ 'add-background-image'}}
|
||||
p.attachment-storage
|
||||
| {{versions.original.storage}}
|
||||
|
||||
if $neq versions.original.storage "fs"
|
||||
a.js-move-storage-fs
|
||||
|
||||
@@ -39,7 +39,7 @@ Template.attachmentGallery.events({
|
||||
'click .js-rename': Popup.open('attachmentRename'),
|
||||
'click .js-confirm-delete': Popup.afterConfirm('attachmentDelete', function() {
|
||||
Attachments.remove(this._id);
|
||||
Popup.back(2);
|
||||
Popup.back();
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -501,7 +501,7 @@ BlazeComponent.extendComponent({
|
||||
if (name === DOMPurify.sanitize(name)) {
|
||||
Meteor.call('renameAttachment', this.data()._id, name);
|
||||
}
|
||||
Popup.back(2);
|
||||
Popup.back();
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
box-sizing: border-box;
|
||||
top: 97px;
|
||||
left: 0px;
|
||||
height: calc(100% - 20px);
|
||||
height: calc(100% - 100px);
|
||||
width: calc(100% - 20px);
|
||||
float: left;
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ template(name="cardDetails")
|
||||
|
||||
+attachmentViewer
|
||||
|
||||
section.card-details.js-card-details(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas
|
||||
section.card-details.js-card-details.nodragscroll(class='{{#if cardMaximized}}card-details-maximized{{/if}}' class='{{#if isPopup}}card-details-popup{{/if}}'): .card-details-canvas
|
||||
.card-details-header(class='{{#if colorClass}}card-details-{{colorClass}}{{/if}}')
|
||||
+inlinedForm(classNames="js-card-details-title")
|
||||
+editCardTitleForm
|
||||
@@ -13,11 +13,12 @@ template(name="cardDetails")
|
||||
unless isMiniScreen
|
||||
unless isPopup
|
||||
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
|
||||
if cardMaximized
|
||||
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
|
||||
else
|
||||
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
|
||||
if currentUser.isBoardMember
|
||||
if canModifyCard
|
||||
if cardMaximized
|
||||
a.fa.fa-window-minimize.minimize-card-details.js-minimize-card-details(title="{{_ 'minimize-card'}}")
|
||||
else
|
||||
a.fa.fa-window-maximize.maximize-card-details.js-maximize-card-details(title="{{_ 'maximize-card'}}")
|
||||
if canModifyCard
|
||||
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
a.fa.fa-link.card-copy-button.js-copy-link(
|
||||
id="cardURL_copy"
|
||||
@@ -29,7 +30,7 @@ template(name="cardDetails")
|
||||
else
|
||||
unless isPopup
|
||||
a.fa.fa-times-thin.close-card-details.js-close-card-details(title="{{_ 'close-card'}}")
|
||||
if currentUser.isBoardMember
|
||||
if canModifyCard
|
||||
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
a.fa.fa-link.card-copy-mobile-button.js-copy-link(
|
||||
id="cardURL_copy"
|
||||
@@ -524,13 +525,12 @@ template(name="cardDetails")
|
||||
a.fa.fa-times-thin.js-close-inlined-form
|
||||
else
|
||||
if currentBoard.allowsDescriptionText
|
||||
a.js-open-inlined-form.right(title="{{_ 'edit'}}" value=title)
|
||||
a.js-open-inlined-form(title="{{_ 'edit'}}" value=title)
|
||||
i.fa.fa-pencil-square-o
|
||||
if getDescription
|
||||
+viewer
|
||||
= getDescription
|
||||
else
|
||||
| {{_ 'edit'}}
|
||||
a.js-open-inlined-form(title="{{_ 'edit'}}" value=title)
|
||||
if getDescription
|
||||
+viewer
|
||||
= getDescription
|
||||
if (hasUnsavedValue 'cardDescription' _id)
|
||||
p.quiet
|
||||
| {{_ 'unsaved-description'}}
|
||||
|
||||
@@ -846,13 +846,15 @@ BlazeComponent.extendComponent({
|
||||
'click .js-palette-color'() {
|
||||
this.currentColor.set(this.currentData().color);
|
||||
},
|
||||
'click .js-submit'() {
|
||||
'click .js-submit'(event) {
|
||||
event.preventDefault();
|
||||
this.currentCard.setColor(this.currentColor.get());
|
||||
Popup.close();
|
||||
Popup.back();
|
||||
},
|
||||
'click .js-remove-color'() {
|
||||
'click .js-remove-color'(event) {
|
||||
event.preventDefault();
|
||||
this.currentCard.setColor(null);
|
||||
Popup.close();
|
||||
Popup.back();
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
@@ -22,7 +22,7 @@ template(name="checklists")
|
||||
i.fa.fa-plus
|
||||
|
||||
template(name="checklistDetail")
|
||||
.js-checklist.checklist
|
||||
.js-checklist.checklist.nodragscroll
|
||||
+inlinedForm(classNames="js-edit-checklist-title" checklist = checklist)
|
||||
+editChecklistItemForm(checklist = checklist)
|
||||
else
|
||||
|
||||
@@ -37,5 +37,4 @@ template(name="cardLabelsPopup")
|
||||
= name
|
||||
if(isLabelSelected ../_id)
|
||||
i.card-label-selectable-icon.fa.fa-check
|
||||
if currentUser.isBoardAdmin
|
||||
a.quiet-button.full.js-add-label {{_ 'label-create'}}
|
||||
a.quiet-button.full.js-add-label {{_ 'label-create'}}
|
||||
@@ -56,10 +56,12 @@
|
||||
float: right;
|
||||
font-size: 18px;
|
||||
padding-right: 30px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
.minicard-details-menu {
|
||||
float: right;
|
||||
font-size: 18px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
@media print {
|
||||
.minicard-details-menu,
|
||||
@@ -99,7 +101,7 @@
|
||||
background-size: contain;
|
||||
height: 145px;
|
||||
user-select: none;
|
||||
margin: -6px -8px 6px -8px;
|
||||
margin: 6px -8px 6px -8px;
|
||||
border-radius: top 2px;
|
||||
}
|
||||
.minicard .minicard-labels {
|
||||
@@ -173,7 +175,6 @@
|
||||
.minicard .minicard-title .viewer {
|
||||
display: block;
|
||||
word-wrap: break-word;
|
||||
max-width: 230px;
|
||||
}
|
||||
}
|
||||
.minicard .dates {
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
template(name="minicard")
|
||||
.minicard(
|
||||
.minicard.nodragscroll(
|
||||
class="{{#if isLinkedCard}}linked-card{{/if}}"
|
||||
class="{{#if isLinkedBoard}}linked-board{{/if}}"
|
||||
class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}")
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.fa.fa-navicon.minicard-details-menu-with-handle.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
else
|
||||
a.fa.fa-navicon.minicard-details-menu.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
if canModifyCard
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.fa.fa-navicon.minicard-details-menu-with-handle.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
else
|
||||
a.fa.fa-navicon.minicard-details-menu.js-open-minicard-details-menu(title="{{_ 'cardDetailsActionsPopup-title'}}")
|
||||
.dates
|
||||
if getReceived
|
||||
unless getStart
|
||||
@@ -129,12 +130,12 @@ template(name="minicard")
|
||||
each getMembers
|
||||
+userAvatar(userId=this)
|
||||
|
||||
if showCreator
|
||||
if showCreatorOnMinicard
|
||||
.minicard-creator
|
||||
+userAvatar(userId=this.userId noRemove=true)
|
||||
|
||||
.badges
|
||||
unless currentUser.isNoComments
|
||||
if canModifyCard
|
||||
if comments.length
|
||||
.badge(title="{{_ 'card-comments-title' comments.length }}")
|
||||
span.badge-icon.fa.fa-comment-o.badge-comment.badge-text
|
||||
@@ -189,12 +190,11 @@ template(name="editCardSortOrderPopup")
|
||||
|
||||
template(name="minicardDetailsActionsPopup")
|
||||
ul.pop-over-list
|
||||
if currentUser.isBoardAdmin
|
||||
if canModifyCard
|
||||
li
|
||||
a.js-move-card
|
||||
i.fa.fa-arrow-right
|
||||
| {{_ 'moveCardPopup-title'}}
|
||||
unless currentUser.isWorker
|
||||
li
|
||||
a.js-copy-card
|
||||
i.fa.fa-copy
|
||||
|
||||
@@ -37,16 +37,12 @@ BlazeComponent.extendComponent({
|
||||
return ret;
|
||||
},
|
||||
|
||||
showCreator() {
|
||||
showCreatorOnMinicard() {
|
||||
// cache "board" to reduce the mini-mongodb access
|
||||
const board = this.data().board();
|
||||
let ret = false;
|
||||
if (board) {
|
||||
ret =
|
||||
board.allowsCreator === null ||
|
||||
board.allowsCreator === undefined ||
|
||||
board.allowsCreator
|
||||
;
|
||||
ret = board.allowsCreatorOnMinicard ?? false;
|
||||
}
|
||||
return ret;
|
||||
},
|
||||
|
||||
@@ -7,17 +7,11 @@
|
||||
border-left: 1px solid #ccc;
|
||||
padding: 0;
|
||||
float: left;
|
||||
min-width: 100px; /* TODO(mark-i-m): hardcoded? */
|
||||
/*max-width: 270px;*/
|
||||
/* Reverted incomplete change list width: */
|
||||
/* https://github.com/wekan/wekan/issues/4558 */
|
||||
/* Orinal width: 270px. Changes not saved yet: */
|
||||
/*resize: both; - List width and height resizeable */
|
||||
/* overflow: auto; - List width and height resizeable */
|
||||
}
|
||||
[id^="swimlane-"] .list:first-child {
|
||||
min-width: 20px;
|
||||
}
|
||||
.list:first-child {
|
||||
min-width: 20px;
|
||||
margin-left: 5px;
|
||||
border-left: none;
|
||||
}
|
||||
.card-details + .list {
|
||||
@@ -48,7 +42,7 @@
|
||||
}
|
||||
.list-header-add {
|
||||
flex: 0 0 auto;
|
||||
padding: 20px 12px 4px;
|
||||
padding: 12px;
|
||||
position: relative;
|
||||
min-height: 20px;
|
||||
}
|
||||
@@ -81,6 +75,20 @@
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
.list-rotated {
|
||||
width: 10px;
|
||||
height: 250px;
|
||||
margin-top: -90px;
|
||||
margin-left: -110px;
|
||||
margin-right: 0;
|
||||
transform: rotate(90deg);
|
||||
position: relative;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.list-header .list-rotated {
|
||||
|
||||
}
|
||||
.list-header .list-header-watch-icon {
|
||||
padding-left: 10px;
|
||||
@@ -99,6 +107,23 @@
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .list-header-collapse-right {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-collapse-left {
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .list-header-uncollapse-left {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-uncollapse-right {
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.list-header .list-header-collapse {
|
||||
color: #a6a6a6;
|
||||
margin-right: 15px;
|
||||
}
|
||||
.list-header .highlight {
|
||||
color: #ce1414;
|
||||
}
|
||||
@@ -297,7 +322,6 @@
|
||||
}
|
||||
.list-header-white {
|
||||
border-bottom: 6px solid #fff;
|
||||
border: 1px solid #eee;
|
||||
}
|
||||
.list-header-green {
|
||||
border-bottom: 6px solid #3cb500;
|
||||
@@ -330,7 +354,7 @@
|
||||
border-bottom: 6px solid #51e898;
|
||||
}
|
||||
.list-header-silver {
|
||||
border-bottom: 6px solid unset;
|
||||
border-bottom: 6px solid #e4e4e4;
|
||||
}
|
||||
.list-header-peachpuff {
|
||||
border-bottom: 6px solid #ffdab9;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
template(name='list')
|
||||
.list.js-list(id="js-list-{{_id}}"
|
||||
style="width:{{listWidth}}px;")
|
||||
style="{{#unless collapsed}}width:{{listWidth}}px;{{/unless}}"
|
||||
class="{{#if collapsed}}list-collapsed{{/if}}")
|
||||
+listHeader
|
||||
+listBody
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
listWidth() {
|
||||
const user = Meteor.user();
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
const list = Template.currentData();
|
||||
return user.getListWidth(list.boardId, list._id);
|
||||
},
|
||||
|
||||
@@ -1,37 +1,38 @@
|
||||
template(name="listBody")
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.length
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
ul.sidebar-list
|
||||
each customFieldsSum
|
||||
li
|
||||
+viewer
|
||||
= name
|
||||
if $eq customFieldsSum.type "number"
|
||||
unless collapsed
|
||||
.list-body
|
||||
.minicards.clearfix.js-minicards(class="{{#if reachedWipLimit}}js-list-full{{/if}}")
|
||||
if cards.length
|
||||
+inlinedForm(autoclose=false position="top")
|
||||
+addCardForm(listId=_id position="top")
|
||||
ul.sidebar-list
|
||||
each customFieldsSum
|
||||
li
|
||||
+viewer
|
||||
= value
|
||||
if $eq customFieldsSum.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(value)
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=originRelativeUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
if MultiSelection.isActive
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
+spinnerList
|
||||
= name
|
||||
if $eq customFieldsSum.type "number"
|
||||
+viewer
|
||||
= value
|
||||
if $eq customFieldsSum.type "currency"
|
||||
+viewer
|
||||
= formattedCurrencyCustomFieldValue(value)
|
||||
each (cardsWithLimit (idOrNull ../../_id))
|
||||
a.minicard-wrapper.js-minicard(href=originRelativeUrl
|
||||
class="{{#if cardIsSelected}}is-selected{{/if}}"
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
if MultiSelection.isActive
|
||||
.materialCheckBox.multi-selection-checkbox.js-toggle-multi-selection(
|
||||
class="{{#if MultiSelection.isSelected _id}}is-checked{{/if}}")
|
||||
+minicard(this)
|
||||
if (showSpinner (idOrNull ../../_id))
|
||||
+spinnerList
|
||||
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
else
|
||||
a.open-minicard-composer.js-card-composer.js-open-inlined-form(title="{{_ 'add-card-to-bottom-of-list'}}")
|
||||
i.fa.fa-plus
|
||||
if canSeeAddCard
|
||||
+inlinedForm(autoclose=false position="bottom")
|
||||
+addCardForm(listId=_id position="bottom")
|
||||
else
|
||||
a.open-minicard-composer.js-card-composer.js-open-inlined-form(title="{{_ 'add-card-to-bottom-of-list'}}")
|
||||
i.fa.fa-plus
|
||||
|
||||
template(name="spinnerList")
|
||||
.sk-spinner.sk-spinner-list(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
template(name="listHeader")
|
||||
.list-header.js-list-header(
|
||||
.list-header.js-list-header.nodragscroll(
|
||||
class="{{#if limitToShowCardsCount}}list-header-card-count{{/if}}"
|
||||
class=colorClass)
|
||||
+inlinedForm
|
||||
@@ -8,19 +8,40 @@ template(name="listHeader")
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
|
||||
else
|
||||
if collapsed
|
||||
a.js-collapse(title="{{_ 'uncollapse'}}")
|
||||
i.fa.fa-arrow-left.list-header-uncollapse-left
|
||||
i.fa.fa-arrow-right.list-header-uncollapse-right
|
||||
if showCardsCountForList cards.length
|
||||
br
|
||||
span.cardCount {{cardsCount}}
|
||||
if isMiniScreen
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
else
|
||||
div(class="{{#if collapsed}}list-rotated{{/if}}")
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}{{#unless currentUser.isWorker}}js-open-inlined-form is-editable{{/unless}}{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
if wipLimit.enabled
|
||||
| (
|
||||
span(class="{{#if exceededWipLimit}}highlight{{/if}}") {{cards.length}}
|
||||
|/#{wipLimit.value})
|
||||
unless collapsed
|
||||
if showCardsCountForList cards.length
|
||||
span.cardCount {{cardsCount}} {{cardsCountForListIsOne cards.length}}
|
||||
if isMiniScreen
|
||||
if currentList
|
||||
if isWatching
|
||||
@@ -36,16 +57,20 @@ template(name="listHeader")
|
||||
else if currentUser.isBoardMember
|
||||
if isWatching
|
||||
i.list-header-watch-icon.fa.fa-eye
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
unless collapsed
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-top(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.js-collapse(title="{{_ 'collapse'}}")
|
||||
i.fa.fa-arrow-right.list-header-collapse-right
|
||||
i.fa.fa-arrow-left.list-header-collapse-left
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
|
||||
template(name="editListTitleForm")
|
||||
.list-composer
|
||||
|
||||
@@ -31,6 +31,17 @@ BlazeComponent.extendComponent({
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
collapsed(check = undefined) {
|
||||
const list = Template.currentData();
|
||||
const status = list.isCollapsed();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
list.collapse(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
editTitle(event) {
|
||||
event.preventDefault();
|
||||
const newTitle = this.childComponents('inlinedForm')[0]
|
||||
@@ -104,6 +115,10 @@ BlazeComponent.extendComponent({
|
||||
event.preventDefault();
|
||||
this.starred(!this.starred());
|
||||
},
|
||||
'click .js-collapse'(event) {
|
||||
event.preventDefault();
|
||||
this.collapsed(!this.collapsed());
|
||||
},
|
||||
'click .js-open-list-menu': Popup.open('listAction'),
|
||||
'click .js-add-card.list-header-plus-top'(event) {
|
||||
const listDom = $(event.target).parents(
|
||||
@@ -347,7 +362,7 @@ BlazeComponent.extendComponent({
|
||||
listWidthValue() {
|
||||
const list = Template.currentData();
|
||||
const board = list.boardId;
|
||||
return Meteor.user().getListWidth(board, list._id);
|
||||
return ReactiveCache.getCurrentUser().getListWidth(board, list._id);
|
||||
},
|
||||
|
||||
events() {
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
.new-comment a.fa.fa-brands.fa-markdown,
|
||||
.inlined-form a.fa.fa-brands.fa-markdown {
|
||||
float: right;
|
||||
position: relative;
|
||||
top: 20px;
|
||||
right: 56px;
|
||||
position: absolute;
|
||||
top: -10px;
|
||||
right: 60px;
|
||||
}
|
||||
.new-comment a.fa.fa-copy,
|
||||
.inlined-form a.fa.fa-copy {
|
||||
float: right;
|
||||
position: relative;
|
||||
top: 20px;
|
||||
right: 6px;
|
||||
top: -10px;
|
||||
right: 5px;
|
||||
}
|
||||
.js-inlined-form.viewer.btn-sm {
|
||||
position: absolute;
|
||||
|
||||
@@ -470,6 +470,7 @@ a:not(.disabled).is-active i.fa {
|
||||
.select-authentication {
|
||||
width: 100%;
|
||||
}
|
||||
.textBelowCustomLoginLogo,
|
||||
.auth-layout {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -37,10 +37,13 @@ template(name="userFormsLayout")
|
||||
else
|
||||
img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto")
|
||||
br
|
||||
if currentSetting.textBelowCustomLoginLogo
|
||||
+viewer
|
||||
| {{currentSetting.textBelowCustomLoginLogo}}
|
||||
br
|
||||
if currentSetting.textBelowCustomLoginLogo
|
||||
hr
|
||||
section.textBelowCustomLoginLogo
|
||||
+viewer
|
||||
| {{currentSetting.textBelowCustomLoginLogo}}
|
||||
hr
|
||||
section.auth-layout
|
||||
section.auth-dialog
|
||||
if isLoading
|
||||
+loader
|
||||
|
||||
@@ -70,13 +70,14 @@ template(name="myCards")
|
||||
unless isMiniScreen
|
||||
.my-cards-board-badge(class=board.colorClass, id="header")
|
||||
.my-cards-card-title-table
|
||||
a.minicard-wrapper(href=card.originRelativeUrl)
|
||||
| {{card.title}}
|
||||
| {{card.title}}
|
||||
//a.minicard-wrapper(href=card.originRelativeUrl)
|
||||
// | {{card.title}}
|
||||
td
|
||||
| {{list.title}}
|
||||
td
|
||||
a(href=board.originRelativeUrl)
|
||||
| {{board.title}}
|
||||
//a(href=board.originRelativeUrl)
|
||||
td
|
||||
| {{swimlane.title}}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ template(name='notificationsDrawer')
|
||||
a.fa.fa-times-thin.close
|
||||
ul.notifications
|
||||
each transformedProfile.notifications
|
||||
+notification(activityData=activity index=dbIndex read=read)
|
||||
+notification(activityData=activityObj index=dbIndex read=read)
|
||||
if($gt unreadNotifications 0)
|
||||
a.all-read {{_ 'mark-all-as-read'}}
|
||||
if ($and ($.Session.get 'showReadNotifications') ($gt readNotifications 0))
|
||||
|
||||
@@ -58,18 +58,20 @@ template(name="rulesReport")
|
||||
h1 {{_ 'rulesReportTitle'}}
|
||||
if resultsCount
|
||||
table
|
||||
tr
|
||||
th Rule Title
|
||||
th Board Title
|
||||
th actionType
|
||||
th activityType
|
||||
thead
|
||||
tr
|
||||
th Rule Title
|
||||
th Board Title
|
||||
th actionType
|
||||
th activityType
|
||||
|
||||
each rule in results
|
||||
tr
|
||||
td {{ rule.title }}
|
||||
td {{ rule.boardTitle }}
|
||||
td {{ rule.action.actionType }}
|
||||
td {{ rule.trigger.activityType }}
|
||||
tbody
|
||||
tr
|
||||
td {{ rule.title }}
|
||||
td {{ rule.boardTitle }}
|
||||
td {{ rule.action.actionType }}
|
||||
td {{ rule.trigger.activityType }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
|
||||
@@ -77,22 +79,24 @@ template(name="filesReport")
|
||||
h1 {{_ 'filesReportTitle'}}
|
||||
if resultsCount
|
||||
table
|
||||
tr
|
||||
th Filename
|
||||
th.right Size (kB)
|
||||
th MIME Type
|
||||
th Attachment ID
|
||||
th Board ID
|
||||
th Card ID
|
||||
thead
|
||||
tr
|
||||
th Filename
|
||||
th.right Size (kB)
|
||||
th MIME Type
|
||||
th Attachment ID
|
||||
th Board ID
|
||||
th Card ID
|
||||
|
||||
each att in results
|
||||
tr
|
||||
td {{ att.name }}
|
||||
td.right {{ fileSize att.size }}
|
||||
td {{ att.type }}
|
||||
td {{ att._id }}
|
||||
td {{ att.meta.boardId }}
|
||||
td {{ att.meta.cardId }}
|
||||
tbody
|
||||
tr
|
||||
td {{ att.name }}
|
||||
td.right {{ fileSize att.size }}
|
||||
td {{ att.type }}
|
||||
td {{ att._id }}
|
||||
td {{ att.meta.boardId }}
|
||||
td {{ att.meta.cardId }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
|
||||
@@ -100,22 +104,24 @@ template(name="cardsReport")
|
||||
h1 {{_ 'cardsReportTitle'}}
|
||||
if resultsCount
|
||||
table.table
|
||||
tr
|
||||
th Card Title
|
||||
th Board
|
||||
th Swimlane
|
||||
th List
|
||||
th Members
|
||||
th Assignees
|
||||
thead
|
||||
tr
|
||||
th Card Title
|
||||
th Board
|
||||
th Swimlane
|
||||
th List
|
||||
th Members
|
||||
th Assignees
|
||||
|
||||
each card in results
|
||||
tr
|
||||
td {{abbreviate card.title }}
|
||||
td {{abbreviate card.board.title }}
|
||||
td {{abbreviate card.swimlane.title }}
|
||||
td {{abbreviate card.list.title }}
|
||||
td {{userNames card.members }}
|
||||
td {{userNames card.assignees }}
|
||||
tbody
|
||||
tr
|
||||
td {{abbreviate card.title }}
|
||||
td {{abbreviate card.board.title }}
|
||||
td {{abbreviate card.swimlane.title }}
|
||||
td {{abbreviate card.list.title }}
|
||||
td {{userNames card.members }}
|
||||
td {{userNames card.assignees }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
|
||||
@@ -123,22 +129,25 @@ template(name="boardsReport")
|
||||
h1 {{_ 'boardsReportTitle'}}
|
||||
if resultsCount
|
||||
table.table
|
||||
tr
|
||||
th Title
|
||||
th Id
|
||||
th Permission
|
||||
th Archived?
|
||||
th Members
|
||||
th Organizations
|
||||
th Teams
|
||||
|
||||
each board in results
|
||||
thead
|
||||
tr
|
||||
td {{abbreviate board.title }}
|
||||
td {{abbreviate board._id }}
|
||||
td {{ board.permission }}
|
||||
td
|
||||
= yesOrNo(board.archived)
|
||||
td {{userNames board.members }}
|
||||
th Title
|
||||
th Id
|
||||
th Permission
|
||||
th Archived?
|
||||
th Members
|
||||
th Organizations
|
||||
th Teams
|
||||
each board in results
|
||||
tbody
|
||||
tr
|
||||
td {{abbreviate board.title }}
|
||||
td {{abbreviate board._id }}
|
||||
td {{ board.permission }}
|
||||
td
|
||||
= yesOrNo(board.archived)
|
||||
td {{userNames board.members }}
|
||||
td {{orgs board.orgs }}
|
||||
td {{teams board.teams }}
|
||||
else
|
||||
div {{_ 'no-results' }}
|
||||
@@ -170,8 +170,27 @@ class AdminReport extends BlazeComponent {
|
||||
.join(", ");
|
||||
return ret;
|
||||
}
|
||||
teams(memberTeams) {
|
||||
const ret = (memberTeams || [])
|
||||
.map(_memberTeam => {
|
||||
const _ret = ReactiveCache.getTeam(_memberTeam.teamId)?.teamDisplayName || _memberTeam.teamId;
|
||||
return _ret;
|
||||
})
|
||||
.join(", ");
|
||||
return ret;
|
||||
}
|
||||
orgs(orgs) {
|
||||
const ret = (orgs || [])
|
||||
.map(_orgs => {
|
||||
const _ret = ReactiveCache.getOrg(_orgs.orgId)?.orgDisplayName || _orgs.orgId;
|
||||
return _ret;
|
||||
})
|
||||
.join(", ");
|
||||
return ret;
|
||||
}
|
||||
}.register('boardsReport'));
|
||||
|
||||
|
||||
(class extends AdminReport {
|
||||
collection = Cards;
|
||||
|
||||
|
||||
@@ -73,22 +73,25 @@ template(name="people")
|
||||
|
||||
template(name="orgGeneral")
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th {{_ 'displayName'}}
|
||||
th {{_ 'description'}}
|
||||
th {{_ 'shortName'}}
|
||||
th {{_ 'autoAddUsersWithDomainName'}}
|
||||
th {{_ 'website'}}
|
||||
th {{_ 'createdAt'}}
|
||||
th {{_ 'active'}}
|
||||
th
|
||||
+newOrgRow
|
||||
tbody
|
||||
tr
|
||||
each org in orgList
|
||||
+orgRow(orgId=org._id)
|
||||
|
||||
template(name="teamGeneral")
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th {{_ 'displayName'}}
|
||||
th {{_ 'description'}}
|
||||
@@ -98,6 +101,8 @@ template(name="teamGeneral")
|
||||
th {{_ 'active'}}
|
||||
th
|
||||
+newTeamRow
|
||||
tbody
|
||||
tr
|
||||
each team in teamList
|
||||
+teamRow(teamId=team._id)
|
||||
|
||||
@@ -105,7 +110,7 @@ template(name="peopleGeneral")
|
||||
#divAddOrRemoveTeamContainer
|
||||
+modifyTeamsUsers
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th
|
||||
+selectAllUser
|
||||
@@ -123,6 +128,8 @@ template(name="peopleGeneral")
|
||||
th {{_ 'teams'}}
|
||||
th
|
||||
+newUserRow
|
||||
tbody
|
||||
tr
|
||||
each user in peopleList
|
||||
+peopleRow(userId=user._id)
|
||||
|
||||
@@ -159,6 +166,10 @@ template(name="orgRow")
|
||||
td {{ orgData.orgShortName }}
|
||||
else
|
||||
td <s>{{ orgData.orgShortName }}</s>
|
||||
if orgData.orgIsActive
|
||||
td {{ orgData.orgAutoAddUsersWithDomainName }}
|
||||
else
|
||||
td <s>{{ orgData.orgAutoAddUsersWithDomainName }}</s>
|
||||
if orgData.orgIsActive
|
||||
td {{ orgData.orgWebsite }}
|
||||
else
|
||||
@@ -307,9 +318,12 @@ template(name="editOrgPopup")
|
||||
label
|
||||
| {{_ 'shortName'}}
|
||||
input.js-orgShortName(type="text" value=org.orgShortName required)
|
||||
label
|
||||
| {{_ 'autoAddUsersWithDomainName'}}
|
||||
input.js-orgAutoAddUsersWithDomainName(type="text" value=org.orgAutoAddUsersWithDomainName)
|
||||
label
|
||||
| {{_ 'website'}}
|
||||
input.js-orgWebsite(type="text" value=org.orgWebsite required)
|
||||
input.js-orgWebsite(type="text" value=org.orgWebsite)
|
||||
label
|
||||
| {{_ 'active'}}
|
||||
select.select-active.js-org-isactive
|
||||
@@ -335,7 +349,7 @@ template(name="editTeamPopup")
|
||||
input.js-teamShortName(type="text" value=team.teamShortName required)
|
||||
label
|
||||
| {{_ 'website'}}
|
||||
input.js-teamWebsite(type="text" value=team.teamWebsite required)
|
||||
input.js-teamWebsite(type="text" value=team.teamWebsite)
|
||||
label
|
||||
| {{_ 'active'}}
|
||||
select.select-active.js-team-isactive
|
||||
@@ -405,7 +419,7 @@ template(name="editUserPopup")
|
||||
each value in orgsDatas
|
||||
option(value="{{value._id}}") {{value.orgDisplayName}}
|
||||
input#jsUserOrgsInPut.js-userOrgs(type="text" value=user.orgsUserBelongs, disabled)
|
||||
input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="text" value=user.orgIdsUserBelongs)
|
||||
input#jsUserOrgIdsInPut.js-userOrgIds.hide(type="hidden" value=user.orgIdsUserBelongs)
|
||||
label
|
||||
| {{_ 'teams'}}
|
||||
i.fa.fa-plus-square#addUserTeam
|
||||
@@ -415,7 +429,7 @@ template(name="editUserPopup")
|
||||
each value in teamsDatas
|
||||
option(value="{{value._id}}") {{_ value.teamDisplayName}}
|
||||
input#jsUserTeamsInPut.js-userteams(type="text" value=user.teamsUserBelongs, disabled)
|
||||
input#jsUserTeamIdsInPut.js-userteamIds.hide(type="text" value=user.teamIdsUserBelongs)
|
||||
input#jsUserTeamIdsInPut.js-userteamIds.hide(type="hidden" value=user.teamIdsUserBelongs)
|
||||
|
||||
hr
|
||||
label
|
||||
@@ -436,6 +450,9 @@ template(name="newOrgPopup")
|
||||
label
|
||||
| {{_ 'shortName'}}
|
||||
input.js-orgShortName(type="text" value="" required)
|
||||
label
|
||||
| {{_ 'autoAddUsersWithDomainName'}}
|
||||
input.js-orgAutoAddUsersWithDomainName(type="text" value="")
|
||||
label
|
||||
| {{_ 'website'}}
|
||||
input.js-orgWebsite(type="text" value="" required)
|
||||
@@ -462,7 +479,7 @@ template(name="newTeamPopup")
|
||||
input.js-teamShortName(type="text" value="" required)
|
||||
label
|
||||
| {{_ 'website'}}
|
||||
input.js-teamWebsite(type="text" value="" required)
|
||||
input.js-teamWebsite(type="text" value="")
|
||||
label
|
||||
| {{_ 'active'}}
|
||||
select.select-active.js-team-isactive
|
||||
|
||||
@@ -576,12 +576,14 @@ Template.editOrgPopup.events({
|
||||
.value.trim();
|
||||
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
|
||||
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
|
||||
const orgAutoAddUsersWithDomainName = templateInstance.find('.js-orgAutoAddUsersWithDomainName').value.trim();
|
||||
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
|
||||
const orgIsActive = templateInstance.find('.js-org-isactive').value.trim() == 'true';
|
||||
|
||||
const isChangeOrgDisplayName = orgDisplayName !== org.orgDisplayName;
|
||||
const isChangeOrgDesc = orgDesc !== org.orgDesc;
|
||||
const isChangeOrgShortName = orgShortName !== org.orgShortName;
|
||||
const isChangeOrgAutoAddUsersWithDomainName = orgAutoAddUsersWithDomainName !== org.orgAutoAddUsersWithDomainName;
|
||||
const isChangeOrgWebsite = orgWebsite !== org.orgWebsite;
|
||||
const isChangeOrgIsActive = orgIsActive !== org.orgIsActive;
|
||||
|
||||
@@ -589,6 +591,7 @@ Template.editOrgPopup.events({
|
||||
isChangeOrgDisplayName ||
|
||||
isChangeOrgDesc ||
|
||||
isChangeOrgShortName ||
|
||||
isChangeOrgAutoAddUsersWithDomainName ||
|
||||
isChangeOrgWebsite ||
|
||||
isChangeOrgIsActive
|
||||
) {
|
||||
@@ -598,6 +601,7 @@ Template.editOrgPopup.events({
|
||||
orgDisplayName,
|
||||
orgDesc,
|
||||
orgShortName,
|
||||
orgAutoAddUsersWithDomainName,
|
||||
orgWebsite,
|
||||
orgIsActive,
|
||||
);
|
||||
@@ -920,6 +924,7 @@ Template.newOrgPopup.events({
|
||||
.value.trim();
|
||||
const orgDesc = templateInstance.find('.js-orgDesc').value.trim();
|
||||
const orgShortName = templateInstance.find('.js-orgShortName').value.trim();
|
||||
const orgAutoAddUsersWithDomainName = templateInstance.find('.js-orgAutoAddUsersWithDomainName').value.trim();
|
||||
const orgWebsite = templateInstance.find('.js-orgWebsite').value.trim();
|
||||
const orgIsActive =
|
||||
templateInstance.find('.js-org-isactive').value.trim() == 'true';
|
||||
@@ -929,6 +934,7 @@ Template.newOrgPopup.events({
|
||||
orgDisplayName,
|
||||
orgDesc,
|
||||
orgShortName,
|
||||
orgAutoAddUsersWithDomainName,
|
||||
orgWebsite,
|
||||
orgIsActive,
|
||||
);
|
||||
|
||||
@@ -7,11 +7,13 @@
|
||||
display: -moz-flex;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
}
|
||||
.setting-content {
|
||||
color: #727479;
|
||||
background: #dedede;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
}
|
||||
.setting-content .content-title {
|
||||
@@ -56,6 +58,8 @@
|
||||
-moz-user-select: text;
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
max-height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
.setting-content .content-body .main-body ul li {
|
||||
padding: 0.5rem 0.5rem;
|
||||
|
||||
@@ -34,13 +34,14 @@ template(name="translation")
|
||||
|
||||
template(name="translationGeneral")
|
||||
table
|
||||
tbody
|
||||
thead
|
||||
tr
|
||||
th {{_ 'language'}}
|
||||
th {{_ 'text'}}
|
||||
th {{_ 'translation-text'}}
|
||||
th
|
||||
+newTranslationRow
|
||||
tbody
|
||||
each translation in translationList
|
||||
+translationRow(translationId=translation._id)
|
||||
|
||||
|
||||
@@ -16,9 +16,13 @@
|
||||
}
|
||||
.sidebar-xmark {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 5px;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
font-size: 25px;
|
||||
padding: 10px;
|
||||
}
|
||||
.sidebar-xmark:hover {
|
||||
background: rgba(0,0,0,0.15);
|
||||
}
|
||||
.sidebar .sidebar-content {
|
||||
padding: 12px;
|
||||
|
||||
@@ -175,7 +175,7 @@ template(name="boardInfoOnMyBoardsPopup")
|
||||
|
||||
template(name="boardCardSettingsPopup")
|
||||
form.board-card-settings
|
||||
h3 {{_ 'show-on-card'}}
|
||||
h3 {{_ 'show-on-card'}}, {{_ 'show-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-receiveddate(class="{{#if allowsReceivedDate}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsReceivedDate}}is-checked{{/if}}")
|
||||
@@ -206,14 +206,18 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-users
|
||||
| {{_ 'members'}}
|
||||
|
||||
div.check-div
|
||||
a.flex.js-field-has-creator(class="{{#if allowsCreator}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCreator}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-user
|
||||
| {{_ 'creator'}}
|
||||
|
||||
div.check-div
|
||||
a.flex.js-field-has-creator-on-minicard(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCreatorOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-user
|
||||
| {{_ 'creator-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-assignee(class="{{#if allowsAssignee}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsAssignee}}is-checked{{/if}}")
|
||||
@@ -238,6 +242,12 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-sort
|
||||
| {{_ 'card-sorting-by-number'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-sorting-by-number-on-minicard(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-sort
|
||||
| {{_ 'card-sorting-by-number-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-show-lists(class="{{#if allowsShowLists}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsShowLists}}is-checked{{/if}}")
|
||||
@@ -271,6 +281,12 @@ template(name="boardCardSettingsPopup")
|
||||
i.fa.fa-align-left
|
||||
| {{_ 'description'}}
|
||||
| {{_ 'custom-field-text'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-description-text-on-minicard(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-align-left
|
||||
| {{_ 'description-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-checklists(class="{{#if allowsChecklists}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsChecklists}}is-checked{{/if}}")
|
||||
@@ -289,6 +305,19 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'attachments'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-badge-attachment-on-minicard(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'badge-attachment-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-cover-attachment-on-minicard(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-book
|
||||
i.fa.fa-picture-o
|
||||
| {{_ 'cover-attachment-on-minicard'}}
|
||||
//div.check-div
|
||||
// a.flex.js-field-has-comments(class="{{#if allowsComments}}is-checked{{/if}}")
|
||||
// .materialCheckBox(class="{{#if allowsComments}}is-checked{{/if}}")
|
||||
@@ -302,35 +331,6 @@ template(name="boardCardSettingsPopup")
|
||||
// i.fa.fa-history
|
||||
// | {{_ 'activities'}}
|
||||
|
||||
template(name="boardMinicardSettingsPopup")
|
||||
form.board-minicard-settings
|
||||
h3 {{_ 'show-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-description-text-on-minicard(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsDescriptionTextOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-align-left
|
||||
| {{_ 'description-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-cover-attachment-on-minicard(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCoverAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-book
|
||||
i.fa.fa-picture-o
|
||||
| {{_ 'cover-attachment-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-badge-attachment-on-minicard(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsBadgeAttachmentOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'badge-attachment-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-sorting-by-number-on-minicard(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCardSortingByNumberOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-sort
|
||||
| {{_ 'card-sorting-by-number-on-minicard'}}
|
||||
|
||||
template(name="boardSubtaskSettingsPopup")
|
||||
form.board-subtask-settings
|
||||
h3 {{_ 'show-parent-in-minicard'}}
|
||||
@@ -473,10 +473,6 @@ template(name="boardMenuPopup")
|
||||
a.js-card-settings
|
||||
i.fa.fa-id-card-o
|
||||
| {{_ 'card-settings'}}
|
||||
li
|
||||
a.js-minicard-settings
|
||||
i.fa.fa-id-card-o
|
||||
| {{_ 'minicard-settings'}}
|
||||
li
|
||||
a.js-subtask-settings
|
||||
i.fa.fa-sitemap
|
||||
|
||||
@@ -236,7 +236,6 @@ Template.boardMenuPopup.events({
|
||||
'click .js-import-board': Popup.open('chooseBoardSource'),
|
||||
'click .js-subtask-settings': Popup.open('boardSubtaskSettings'),
|
||||
'click .js-card-settings': Popup.open('boardCardSettings'),
|
||||
'click .js-minicard-settings': Popup.open('boardMinicardSettings'),
|
||||
'click .js-export-board': Popup.open('exportBoard'),
|
||||
});
|
||||
|
||||
@@ -914,11 +913,11 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
allowsCreator() {
|
||||
return (
|
||||
this.currentBoard.allowsCreator === null ||
|
||||
this.currentBoard.allowsCreator === undefined ||
|
||||
this.currentBoard.allowsCreator
|
||||
);
|
||||
return this.currentBoard.allowsCreator ?? false;
|
||||
},
|
||||
|
||||
allowsCreatorOnMinicard() {
|
||||
return this.currentBoard.allowsCreatorOnMinicard ?? false;
|
||||
},
|
||||
|
||||
allowsMembers() {
|
||||
@@ -984,6 +983,22 @@ BlazeComponent.extendComponent({
|
||||
);
|
||||
},
|
||||
|
||||
allowsDescriptionTextOnMinicard() {
|
||||
return this.currentBoard.allowsDescriptionTextOnMinicard;
|
||||
},
|
||||
|
||||
allowsCoverAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsCoverAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsBadgeAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsBadgeAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsCardSortingByNumberOnMinicard() {
|
||||
return this.currentBoard.allowsCardSortingByNumberOnMinicard;
|
||||
},
|
||||
|
||||
boards() {
|
||||
const ret = ReactiveCache.getBoards(
|
||||
{
|
||||
@@ -1106,6 +1121,19 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.allowsCreator,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-creator-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsCreatorOnMinicard = !this.currentBoard.allowsCreatorOnMinicard;
|
||||
this.currentBoard.setAllowsCreatorOnMinicard(this.currentBoard.allowsCreatorOnMinicard);
|
||||
$(`.js-field-has-creator-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsCreatorOnMinicard,
|
||||
);
|
||||
$('.js-field-has-creator-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsCreatorOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-members'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsMembers = !this.currentBoard.allowsMembers;
|
||||
@@ -1241,6 +1269,22 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.allowsCardNumber,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-description-text-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard = !this.currentBoard
|
||||
.allowsDescriptionTextOnMinicard;
|
||||
this.currentBoard.setallowsDescriptionTextOnMinicard(
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$(`.js-field-has-description-text-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$('.js-field-has-description-text-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-description-text'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionText = !this.currentBoard
|
||||
@@ -1318,74 +1362,6 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.allowsActivities,
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('boardCardSettingsPopup');
|
||||
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.currentBoard = Utils.getCurrentBoard();
|
||||
},
|
||||
|
||||
allowsDescriptionTextOnMinicard() {
|
||||
return this.currentBoard.allowsDescriptionTextOnMinicard;
|
||||
},
|
||||
|
||||
allowsCoverAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsCoverAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsBadgeAttachmentOnMinicard() {
|
||||
return this.currentBoard.allowsBadgeAttachmentOnMinicard;
|
||||
},
|
||||
|
||||
allowsCardSortingByNumberOnMinicard() {
|
||||
return this.currentBoard.allowsCardSortingByNumberOnMinicard;
|
||||
},
|
||||
|
||||
lists() {
|
||||
return ReactiveCache.getLists(
|
||||
{
|
||||
boardId: this.currentBoard._id,
|
||||
archived: false,
|
||||
},
|
||||
{
|
||||
sort: ['title'],
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
hasLists() {
|
||||
return this.lists().length > 0;
|
||||
},
|
||||
|
||||
isListSelected() {
|
||||
return (
|
||||
this.currentBoard.dateSettingsDefaultBoardId === this.currentData()._id
|
||||
);
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-field-has-description-text-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard = !this.currentBoard
|
||||
.allowsDescriptionTextOnMinicard;
|
||||
this.currentBoard.setallowsDescriptionTextOnMinicard(
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$(`.js-field-has-description-text-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
$('.js-field-has-description-text-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsDescriptionTextOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-cover-attachment-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsCoverAttachmentOnMinicard = !this.currentBoard
|
||||
@@ -1437,7 +1413,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('boardMinicardSettingsPopup');
|
||||
}).register('boardCardSettingsPopup');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
|
||||
@@ -24,9 +24,17 @@ template(name="swimlaneFixedHeader")
|
||||
| {{isTitleDefault title}}
|
||||
.swimlane-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
if currentUser.isBoardAdmin
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
|
||||
a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}")
|
||||
//// TODO: Collapse Swimlane: make button working, etc.
|
||||
//unless collapsed
|
||||
// a.js-collapse-swimlane(title="{{_ 'collapse'}}")
|
||||
// i.fa.fa-arrow-down.swimlane-header-collapse-down
|
||||
// i.fa.fa-arrow-up.swimlane-header-collapse-up
|
||||
//if collapsed
|
||||
// a.js-collapse-swimlane(title="{{_ 'uncollapse'}}")
|
||||
// i.fa.fa-arrow-up.swimlane-header-collapse-up
|
||||
// i.fa.fa-arrow-down.swimlane-header-collapse-down
|
||||
unless isTouchScreen
|
||||
if isShowDesktopDragHandles
|
||||
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
|
||||
@@ -18,10 +18,25 @@ BlazeComponent.extendComponent({
|
||||
swimlane.rename(newTitle.trim());
|
||||
}
|
||||
},
|
||||
collapsed(check = undefined) {
|
||||
const swimlane = Template.currentData();
|
||||
const status = swimlane.isCollapsed();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
swimlane.collapse(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-collapse-swimlane'(event) {
|
||||
event.preventDefault();
|
||||
this.collapsed(!this.collapsed());
|
||||
},
|
||||
'click .js-open-swimlane-menu': Popup.open('swimlaneAction'),
|
||||
'click .js-open-add-swimlane-menu': Popup.open('swimlaneAdd'),
|
||||
submit: this.editTitle,
|
||||
@@ -209,7 +224,7 @@ BlazeComponent.extendComponent({
|
||||
swimlaneHeightValue() {
|
||||
const swimlane = this.currentData();
|
||||
const board = swimlane.boardId;
|
||||
return Meteor.user().getSwimlaneHeight(board, swimlane._id);
|
||||
return ReactiveCache.getCurrentUser().getSwimlaneHeight(board, swimlane._id);
|
||||
},
|
||||
|
||||
events() {
|
||||
|
||||
@@ -1,38 +1,3 @@
|
||||
/*
|
||||
// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
|
||||
.accordion
|
||||
cursor: pointer
|
||||
width: 30px
|
||||
height: 20px
|
||||
border: none
|
||||
outline: none
|
||||
font-size: 18px
|
||||
transition: 0.4s
|
||||
padding-top: 0px
|
||||
margin-top: 0px
|
||||
|
||||
.accordion:after
|
||||
// Unicode triagle right:
|
||||
content: '\25B6'
|
||||
color: #777
|
||||
font-weight: bold
|
||||
float: left
|
||||
|
||||
.active:after
|
||||
// Unicode triangle down:
|
||||
content: '\25BC'
|
||||
|
||||
.panel
|
||||
width: 100%
|
||||
max-height: 0
|
||||
overflow: hidden
|
||||
transition: max-height 0.2s ease-out
|
||||
margin: 0px
|
||||
padding: 0px
|
||||
|
||||
// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
*/
|
||||
@media screen and (min-width: 801px) {
|
||||
.swimlane.ui-sortable {
|
||||
width: max-content;
|
||||
@@ -46,7 +11,30 @@
|
||||
background: #dedede;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow: 0;
|
||||
overflow: auto;
|
||||
max-height: 100%;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-collapse-down {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 100px;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-collapse-up {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
position: absolute;
|
||||
bottom: 5px;
|
||||
left: 100px;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-uncollapse-up {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.swimlane-header-menu .swimlane-header-uncollapse-down {
|
||||
font-size: 50%;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
.swimlane.placeholder {
|
||||
background-color: rgba(0,0,0,0.2);
|
||||
@@ -170,7 +158,7 @@
|
||||
color: #4d4d4d !important;
|
||||
}
|
||||
.swimlane-silver {
|
||||
background: unset !important;
|
||||
background: #ccc !important;
|
||||
color: #4d4d4d !important;
|
||||
}
|
||||
.swimlane-peachpuff {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
template(name="swimlane")
|
||||
.swimlane
|
||||
.swimlane.nodragscroll
|
||||
+swimlaneHeader
|
||||
unless collapseSwimlane
|
||||
.swimlane.js-lists.js-swimlane(id="swimlane-{{_id}}"
|
||||
@@ -46,8 +46,8 @@ template(name="listsGroup")
|
||||
|
||||
template(name="addListForm")
|
||||
unless currentUser.isWorker
|
||||
.list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
|
||||
if currentUser.isBoardAdmin
|
||||
unless currentUser.isCommentOnly
|
||||
.list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
|
||||
.list-header-add
|
||||
+inlinedForm(autoclose=false)
|
||||
input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
|
||||
|
||||
@@ -225,7 +225,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
swimlaneHeight() {
|
||||
const user = Meteor.user();
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
const swimlane = Template.currentData();
|
||||
const height = user.getSwimlaneHeight(swimlane.boardId, swimlane._id);
|
||||
return height == -1 ? "auto" : (height + "px");
|
||||
@@ -288,7 +288,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
Template.swimlane.helpers({
|
||||
canSeeAddList() {
|
||||
return Meteor.user().isBoardAdmin();
|
||||
return ReactiveCache.getCurrentUser().isBoardAdmin();
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -26,9 +26,9 @@ template(name="orgAvatar")
|
||||
template(name="boardOrgRow")
|
||||
tr
|
||||
if orgData.orgIsActive
|
||||
td <s>{{ orgData.orgDisplayName }}</s>
|
||||
else
|
||||
td {{ orgData.orgDisplayName }}
|
||||
else
|
||||
td <s>{{ orgData.orgDisplayName }}</s>
|
||||
td
|
||||
if currentUser.isBoardAdmin
|
||||
a.member.orgOrTeamMember.add-member.js-manage-board-removeOrg(title="{{_ 'remove-from-board'}}")
|
||||
@@ -39,9 +39,9 @@ template(name="boardOrgRow")
|
||||
template(name="boardTeamRow")
|
||||
tr
|
||||
if teamData.teamIsActive
|
||||
td <s>{{ teamData.teamDisplayName }}</s>
|
||||
else
|
||||
td {{ teamData.teamDisplayName }}
|
||||
else
|
||||
td <s>{{ teamData.teamDisplayName }}</s>
|
||||
td
|
||||
if currentUser.isBoardAdmin
|
||||
a.member.orgOrTeamMember.add-member.js-manage-board-removeTeam(title="{{_ 'remove-from-board'}}")
|
||||
|
||||
@@ -325,7 +325,7 @@ Template.changeSettingsPopup.helpers({
|
||||
});
|
||||
},
|
||||
startDayOfWeek() {
|
||||
currentUser = Meteor.user();
|
||||
currentUser = ReactiveCache.getCurrentUser();
|
||||
if (currentUser) {
|
||||
return currentUser.getStartDayOfWeek();
|
||||
} else {
|
||||
@@ -343,7 +343,7 @@ Template.changeSettingsPopup.events({
|
||||
return ret;
|
||||
},
|
||||
'click .js-toggle-desktop-drag-handles'() {
|
||||
currentUser = Meteor.user();
|
||||
const currentUser = ReactiveCache.getCurrentUser();
|
||||
if (currentUser) {
|
||||
Meteor.call('toggleDesktopDragHandles');
|
||||
} else if (window.localStorage.getItem('showDesktopDragHandles')) {
|
||||
@@ -375,7 +375,7 @@ Template.changeSettingsPopup.events({
|
||||
templateInstance.$('#start-day-of-week').val(),
|
||||
10,
|
||||
);
|
||||
const currentUser = Meteor.user();
|
||||
const currentUser = ReactiveCache.getCurrentUser();
|
||||
if (isNaN(minLimit) || minLimit < -1) {
|
||||
minLimit = -1;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ Blaze.registerHelper('isTouchScreenOrShowDesktopDragHandles', () =>
|
||||
Blaze.registerHelper('moment', (...args) => {
|
||||
args.pop(); // hash
|
||||
const [date, format] = args;
|
||||
return moment(date).format(format);
|
||||
return moment(date).format(format ?? 'LLLL');
|
||||
});
|
||||
|
||||
Blaze.registerHelper('canModifyCard', () =>
|
||||
|
||||
@@ -6,10 +6,11 @@ import moment from 'moment/min/moment-with-locales';
|
||||
function adjustedTimeFormat() {
|
||||
return moment
|
||||
.localeData()
|
||||
.longDateFormat('LT')
|
||||
.replace(/HH/i, 'H');
|
||||
.longDateFormat('LT');
|
||||
}
|
||||
|
||||
// .replace(/HH/i, 'H');
|
||||
|
||||
export class DatePicker extends BlazeComponent {
|
||||
template() {
|
||||
return 'datepicker';
|
||||
|
||||
@@ -57,6 +57,9 @@ window.ExportHtml = Popup => {
|
||||
Array.from(
|
||||
document.querySelectorAll('#header-main-bar .board-header-btns'),
|
||||
).forEach(elem => elem.remove());
|
||||
Array.from(
|
||||
document.querySelectorAll('.js-pop-over, .pop-over'),
|
||||
).forEach(elem => elem.remove());
|
||||
Array.from(document.querySelectorAll('.list-composer')).forEach(elem =>
|
||||
elem.remove(),
|
||||
);
|
||||
@@ -152,6 +155,50 @@ window.ExportHtml = Popup => {
|
||||
);
|
||||
};
|
||||
|
||||
const getWebFonts = () => {
|
||||
fontUrls = [];
|
||||
|
||||
for (let sheet of document.styleSheets) {
|
||||
// Get the base URL of the stylesheet
|
||||
let baseUrl = sheet.href ? new URL(sheet.href).origin : window.location.origin;
|
||||
|
||||
try {
|
||||
for (let rule of sheet.cssRules) {
|
||||
if (rule.type === CSSRule.FONT_FACE_RULE) {
|
||||
let src = rule.style.getPropertyValue('src');
|
||||
let urlMatch = src.match(/url\(["']?(.+?)["']?\)/);
|
||||
if (urlMatch) {
|
||||
let fontUrl = urlMatch[1];
|
||||
|
||||
// Resolve the URL relative to the stylesheet's base URL
|
||||
let resolvedUrl = new URL(fontUrl, baseUrl);
|
||||
fontUrls.push(resolvedUrl.href); // Using .href to get the absolute URL
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.log('Access to stylesheet blocked:', e);
|
||||
}
|
||||
}
|
||||
|
||||
return fontUrls;
|
||||
};
|
||||
|
||||
const downloadFonts = async(elements, zip) => {
|
||||
await asyncForEach(elements, async elem => {
|
||||
const response = await fetch(elem);
|
||||
const responseBody = await response.blob();
|
||||
const filename = elem.split('/')
|
||||
.pop()
|
||||
.split('?')
|
||||
.shift()
|
||||
.split('#')
|
||||
.shift();
|
||||
const fileFullPath = `webfonts/${filename}`;
|
||||
zip.file(fileFullPath, responseBody);
|
||||
});
|
||||
}
|
||||
|
||||
const downloadCardCovers = async (elements, zip, boardSlug) => {
|
||||
await asyncForEach(elements, async elem => {
|
||||
const response = await fetch(
|
||||
@@ -194,6 +241,7 @@ window.ExportHtml = Popup => {
|
||||
await downloadStylesheets(getStylesheetList(), zip);
|
||||
await downloadSrcAttached(getSrcAttached(), zip, boardSlug);
|
||||
await downloadCardCovers(getCardCovers(), zip, boardSlug);
|
||||
await downloadFonts(getWebFonts(), zip);
|
||||
|
||||
addBoardHTMLToZip(boardSlug, zip);
|
||||
|
||||
|
||||
@@ -33,6 +33,14 @@ Mousetrap.bind('q', () => {
|
||||
}
|
||||
});
|
||||
|
||||
Mousetrap.bind('a', () => {
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
const currentUserId = Meteor.userId();
|
||||
if (currentBoardId && currentUserId) {
|
||||
Filter.assignees.toggle(currentUserId);
|
||||
}
|
||||
});
|
||||
|
||||
Mousetrap.bind('x', () => {
|
||||
if (Filter.isActive()) {
|
||||
Filter.reset();
|
||||
@@ -181,6 +189,10 @@ Template.keyboardShortcuts.helpers({
|
||||
keys: ['q'],
|
||||
action: 'shortcut-filter-my-cards',
|
||||
},
|
||||
{
|
||||
keys: ['a'],
|
||||
action: 'shortcut-filter-my-assigned-cards',
|
||||
},
|
||||
{
|
||||
keys: ['f'],
|
||||
action: 'shortcut-toggle-filterbar',
|
||||
|
||||
+4
-3
@@ -4,10 +4,11 @@ Utils = {
|
||||
setBackgroundImage(url) {
|
||||
const currentBoard = Utils.getCurrentBoard();
|
||||
if (currentBoard.backgroundImageURL !== undefined) {
|
||||
$(".board-wrapper,.board-wrapper .board-canvas").css({"background":"url(" + currentBoard.backgroundImageURL + ")","background-size":"cover"});
|
||||
$(".board-wrapper").css({"background":"url(" + currentBoard.backgroundImageURL + ")","background-size":"cover"});
|
||||
$(".swimlane,.swimlane .list,.swimlane .list .list-body,.swimlane .list:first-child .list-body").css({"background-color":"transparent"});
|
||||
} else if (currentBoard.color !== undefined) {
|
||||
currentBoard.setColor(currentBoard.color);
|
||||
$(".minicard").css({"opacity": "0.9"});
|
||||
} else if (currentBoard["background-color"]) {
|
||||
currentBoard.setColor(currentBoard["background-color"]);
|
||||
}
|
||||
},
|
||||
/** returns the current board id
|
||||
|
||||
@@ -16,6 +16,8 @@ export const ALLOWED_BOARD_COLORS = [
|
||||
'modern',
|
||||
'moderndark',
|
||||
'exodark',
|
||||
'cleandark',
|
||||
'cleanlight',
|
||||
];
|
||||
export const ALLOWED_COLORS = [
|
||||
'white',
|
||||
|
||||
+3
-3
@@ -1,5 +1,3 @@
|
||||
version: '2'
|
||||
|
||||
# Note: Do not add single quotes '' to variables. Having spaces still works without quotes where required.
|
||||
#---------------------------------------------------------------------------------------------------------
|
||||
# ==== CREATING USERS AND LOGGING IN TO WEKAN ====
|
||||
@@ -368,7 +366,7 @@ services:
|
||||
#-----------------------------------------------------------------
|
||||
# ==== OUTGOING WEBHOOKS ====
|
||||
# What to send to Outgoing Webhook, or leave out. If commented out the default values will be: cardId,listId,oldListId,boardId,comment,user,card,commentId,swimlaneId,customerField,customFieldValue
|
||||
#- WEBHOOKS_ATTRIBUTES=cardId,listId,oldListId,boardId,comment,user,card,commentId
|
||||
#- WEBHOOKS_ATTRIBUTES=cardId,listId,oldListId,boardId,comment,user,card,board,list,swimlane,commentId
|
||||
#-----------------------------------------------------------------
|
||||
# ==== Debug OIDC OAuth2 etc ====
|
||||
#- DEBUG=true
|
||||
@@ -391,6 +389,8 @@ services:
|
||||
#- OAUTH2_CA_CERT=ABCD1234
|
||||
# Use OAuth2 ADFS additional changes. Also needs OAUTH2_ENABLED=true setting.
|
||||
#- OAUTH2_ADFS_ENABLED=false
|
||||
# Azure AD B2C. https://github.com/wekan/wekan/issues/5242
|
||||
#- OAUTH2_B2C_ENABLED=false
|
||||
# OAuth2 login style: popup or redirect.
|
||||
#- OAUTH2_LOGIN_STYLE=redirect
|
||||
# Application GUID captured during app registration:
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
Wekan provides a python script to ease the call of the REST API from command line interface.
|
||||
|
||||
# Context
|
||||
|
||||
- [API Login to get Bearer token](REST-API#example-call---as-form-data)
|
||||
- [API docs and examples for various programming languages](https://wekan.github.io/api/), there is Boards / Export for exporting board with API
|
||||
- In the right menu, scroll down REST API Docs etc links =====>
|
||||
- Wekan-Gogs integration with Node.js https://github.com/wekan/wekan-gogs
|
||||
|
||||
# Install
|
||||
|
||||
You need python3.
|
||||
|
||||
Windows
|
||||
```
|
||||
choco install python3
|
||||
# REBOOT
|
||||
pip3 install pip --upgrade
|
||||
pip3 install json
|
||||
python3 wekan.py
|
||||
```
|
||||
Debian/Ubuntu
|
||||
```
|
||||
sudo apt-get -y install python3 python3-pip python3-simplejson
|
||||
sudo pip3 install pip --upgrade
|
||||
chmod +x wekan.py
|
||||
./wekan.py
|
||||
```
|
||||
|
||||
# Usage
|
||||
|
||||
Copy the api.py script to you machine. [Newest Wekan Python CLI api.py here](https://raw.githubusercontent.com/wekan/wekan/master/api.py).
|
||||
|
||||
Then, in this script, look for and change:
|
||||
- wekanurl: https://boards.example.com => Your Wekan URL
|
||||
- username (could be username or username@example.com)
|
||||
- Only works with password login admin user. Does not work with LDAP, OAuth2 etc.
|
||||
|
||||
Keep in mind your Wekan credentials are potentially accessible in this file.
|
||||
|
||||
Then call it without any argument to see if everything is all right. You should just get usage examples.
|
||||
@@ -0,0 +1,56 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
## Information about boards of user
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
http://localhost:3000/api/users/XQMZgynx9M79qTtQc/boards
|
||||
```
|
||||
|
||||
## Add/Remove Board Member and Change Role
|
||||
|
||||
[Add/Remove Board Member and Change Role admin/normal/nocomments/commentonly](REST-API-Role).
|
||||
|
||||
## The admin takes the ownership of ALL boards of the user (archived and not archived) where the user is admin on.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/users/ztKvBTzCqmyJ77on8 \
|
||||
-d '{ "action": "takeOwnership" }'
|
||||
```
|
||||
|
||||
## Create board
|
||||
|
||||
Required:
|
||||
- "title":"Board title here"
|
||||
- "owner":"ABCDE12345" <= User ID in Wekan. Not username or email.
|
||||
|
||||
Optional, and defaults:
|
||||
- "isAdmin":"true"
|
||||
- "isActive":"true"
|
||||
- "isNoComments":"false"
|
||||
- "isCommentOnly":"false"
|
||||
- "permission":"private" <== Set to "public" if you want public Wekan board
|
||||
- "color":"belize" <== Board color: belize, nephritis, pomegranate, pumpkin, wisteria, midnight.
|
||||
|
||||
<img src="https://wekan.github.io/board-colors.png" width="40%" alt="Wekan logo" />
|
||||
|
||||
Example:
|
||||
```
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards \
|
||||
-d '{"title":"Board title here","owner":"ABCDE12345","permission":"private","color":"nephritis"}'
|
||||
```
|
||||
|
||||
## In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/boards.js "Board API code")
|
||||
@@ -0,0 +1,94 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
# Retrieve cards by swimlane id
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/swimlanes/:swimlaneId/cards](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L487) | `yes` | `GET` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-X GET \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/swimlanes/PgTuf6sFJsaxto5dC/cards
|
||||
```
|
||||
## Result example
|
||||
|
||||
```shell
|
||||
{
|
||||
"_id": "AzEeHS7KAGeYZCcak",
|
||||
"title": "Create Auth Code",
|
||||
"description": "Create Auth Code for application.",
|
||||
"listId": "RPRtDTQMKpShpgqoj"
|
||||
},
|
||||
{
|
||||
...
|
||||
```
|
||||
|
||||
# Add Card to List-Board-Swimlane
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/lists/:listId/cards](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L487) | `yes` | `POST` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards \
|
||||
-d '{ "title": "Card title text", "description": "Card description text", "authorId": "The appropriate existing userId", "swimlaneId": "The destination swimlaneId" }'
|
||||
```
|
||||
## Result example
|
||||
The new card's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# Update a card
|
||||
You can change (any of) the card's title, list, and description.
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/lists/:fromListId/cards/:cardId](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L520) | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards/ssrNX9CvXvPxuC5DE \
|
||||
-d '{ "title": "New title text", "listId": "New destination listId", "description": "New description text" }'
|
||||
```
|
||||
## Result example
|
||||
The card's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
# Delete a card
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/lists/:listId/cards/:cardId](https://github.com/wekan/wekan/blob/c115046a7c86b30ab5deb8762d3ef7a5ea3f4f90/models/cards.js#L554) | `yes` | `DELETE` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X DELETE \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards/ssrNX9CvXvPxuC5DE \
|
||||
-d '{ "authorId": "the appropriate existing userId"}'
|
||||
```
|
||||
## Result example
|
||||
The card's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/cards.js "Card API code")
|
||||
@@ -0,0 +1,148 @@
|
||||
## In Wekan code
|
||||
|
||||
## 1) Checklists
|
||||
|
||||
wekan/models/checklists.js at bottom:
|
||||
|
||||
```
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramCardId = req.params.cardId;
|
||||
const checklists = Checklists.find({ cardId: paramCardId }).map(function (doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
};
|
||||
});
|
||||
if (checklists) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: checklists,
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 500,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramChecklistId = req.params.checklistId;
|
||||
const paramCardId = req.params.cardId;
|
||||
const checklist = Checklists.findOne({ _id: paramChecklistId, cardId: paramCardId });
|
||||
if (checklist) {
|
||||
checklist.items = ChecklistItems.find({checklistId: checklist._id}).map(function (doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
isFinished: doc.isFinished,
|
||||
};
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: checklist,
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 500,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
|
||||
const paramCardId = req.params.cardId;
|
||||
const id = Checklists.insert({
|
||||
title: req.body.title,
|
||||
cardId: paramCardId,
|
||||
sort: 0,
|
||||
});
|
||||
if (id) {
|
||||
req.body.items.forEach(function (item, idx) {
|
||||
ChecklistItems.insert({
|
||||
cardId: paramCardId,
|
||||
checklistId: id,
|
||||
title: item.title,
|
||||
sort: idx,
|
||||
});
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 400,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramChecklistId = req.params.checklistId;
|
||||
Checklists.remove({ _id: paramChecklistId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramChecklistId,
|
||||
},
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 2) Checklist Items
|
||||
|
||||
wekan/models/checklistItems.js at bottom:
|
||||
|
||||
```
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramItemId = req.params.itemId;
|
||||
const checklistItem = ChecklistItems.findOne({ _id: paramItemId });
|
||||
if (checklistItem) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: checklistItem,
|
||||
});
|
||||
} else {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 500,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('PUT', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
|
||||
const paramItemId = req.params.itemId;
|
||||
|
||||
if (req.body.hasOwnProperty('isFinished')) {
|
||||
ChecklistItems.direct.update({_id: paramItemId}, {$set: {isFinished: req.body.isFinished}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('title')) {
|
||||
ChecklistItems.direct.update({_id: paramItemId}, {$set: {title: req.body.title}});
|
||||
}
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramItemId,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId/items/:itemId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramItemId = req.params.itemId;
|
||||
ChecklistItems.direct.remove({ _id: paramItemId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramItemId,
|
||||
},
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,33 @@
|
||||
## Using Meteor with REST API
|
||||
|
||||
### 1) Adding API
|
||||
|
||||
```
|
||||
meteor add simple:json-routes
|
||||
```
|
||||
|
||||
https://atmospherejs.com/simple/json-routes
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/.meteor/packages#L139
|
||||
|
||||
### 2) API code
|
||||
|
||||
At models directory:
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/models/users.js#L2018
|
||||
|
||||
### 3) Login to API as JSON
|
||||
|
||||
https://github.com/wekan/wekan/wiki/REST-API#example-call---as-json
|
||||
|
||||
Also see at wiki right menu about REST API.
|
||||
|
||||
### 4) Use Python3 CLI to login to API and do REST API action
|
||||
|
||||
https://github.com/wekan/wekan/blob/main/api.py
|
||||
|
||||
### 4) API Docs
|
||||
|
||||
https://wekan.github.io/api/
|
||||
|
||||
Building API Docs: https://github.com/wekan/wekan/blob/main/releases/rebuild-docs.sh
|
||||
@@ -0,0 +1,78 @@
|
||||
1) Login as Admin user as Form Data to get Bearer token
|
||||
https://github.com/wekan/wekan/wiki/REST-API#example-call---as-form-data
|
||||
|
||||
2) There needs to be Custom Field added to board
|
||||
https://wekan.github.io/api/v4.42/#wekan-rest-api-customfields
|
||||
|
||||
3) Custom Field at board and card will have same `_id`
|
||||
https://wekan.github.io/api/v4.42/#put_board_list_card
|
||||
|
||||
4) When writing Custom Field value to card, like text field, content type needs to be "application/json" and the string needs to be an array:
|
||||
```
|
||||
-d '{ "customFields" : [ { "_id" : "oZHkpcaxDHnbkbqGo", "value" : "foobar" } ] }'
|
||||
```
|
||||
5) For other types of Custom Fields, you can look at Custom Field structure from MongoDB database with [nosqlbooster](https://nosqlbooster.com/downloads) that can also login through ssh to server Wekan snap MongoDB port 27019
|
||||
|
||||
|
||||
## In Wekan code (old)
|
||||
|
||||
wekan/models/customFields.js , at bottom
|
||||
|
||||
```
|
||||
//CUSTOM FIELD REST API
|
||||
if (Meteor.isServer) {
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: CustomFields.find({ boardId: paramBoardId }),
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramCustomFieldId = req.params.customFieldId;
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: CustomFields.findOne({ _id: paramCustomFieldId, boardId: paramBoardId }),
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/custom-fields', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const id = CustomFields.direct.insert({
|
||||
name: req.body.name,
|
||||
type: req.body.type,
|
||||
settings: req.body.settings,
|
||||
showOnCard: req.body.showOnCard,
|
||||
boardId: paramBoardId,
|
||||
});
|
||||
|
||||
const customField = CustomFields.findOne({_id: id, boardId: paramBoardId });
|
||||
customFieldCreation(req.body.authorId, customField);
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/custom-fields/:customFieldId', function (req, res) {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const id = req.params.customFieldId;
|
||||
CustomFields.remove({ _id: id, boardId: paramBoardId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,191 @@
|
||||
## In Wekan code
|
||||
|
||||
wekan/models/integrations.js at bottom
|
||||
|
||||
```
|
||||
// Get all integrations in board
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/integrations', function(req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const data = Integrations.find({ boardId: paramBoardId }, { fields: { token: 0 } }).map(function(doc) {
|
||||
return doc;
|
||||
});
|
||||
|
||||
JsonRoutes.sendResult(res, {code: 200, data});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Get a single integration in board
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/integrations/:intId', function(req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Integrations.findOne({ _id: paramIntId, boardId: paramBoardId }, { fields: { token: 0 } }),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Create a new integration
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/integrations', function(req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
const id = Integrations.insert({
|
||||
userId: req.userId,
|
||||
boardId: paramBoardId,
|
||||
url: req.body.url,
|
||||
});
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Edit integration data
|
||||
JsonRoutes.add('PUT', '/api/boards/:boardId/integrations/:intId', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
if (req.body.hasOwnProperty('enabled')) {
|
||||
const newEnabled = req.body.enabled;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {enabled: newEnabled}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('title')) {
|
||||
const newTitle = req.body.title;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {title: newTitle}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('url')) {
|
||||
const newUrl = req.body.url;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {url: newUrl}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('token')) {
|
||||
const newToken = req.body.token;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {token: newToken}});
|
||||
}
|
||||
if (req.body.hasOwnProperty('activities')) {
|
||||
const newActivities = req.body.activities;
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$set: {activities: newActivities}});
|
||||
}
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramIntId,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Delete subscribed activities
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
const newActivities = req.body.activities;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$pullAll: {activities: newActivities}});
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Add subscribed activities
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/integrations/:intId/activities', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
const newActivities = req.body.activities;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
Integrations.direct.update({_id: paramIntId, boardId: paramBoardId},
|
||||
{$addToSet: {activities: { $each: newActivities}}});
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Integrations.findOne({_id: paramIntId, boardId: paramBoardId}, { fields: {_id: 1, activities: 1}}),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Delete integration
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/integrations/:intId', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramIntId = req.params.intId;
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
|
||||
Integrations.direct.remove({_id: paramIntId, boardId: paramBoardId});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramIntId,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,89 @@
|
||||
## In Wekan code
|
||||
|
||||
wekan/models/lists.js at bottom:
|
||||
```
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/lists', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
Authentication.checkBoardAccess( req.userId, paramBoardId);
|
||||
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Lists.find({ boardId: paramBoardId, archived: false }).map(function (doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
};
|
||||
}),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('GET', '/api/boards/:boardId/lists/:listId', function (req, res) {
|
||||
try {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramListId = req.params.listId;
|
||||
Authentication.checkBoardAccess( req.userId, paramBoardId);
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Lists.findOne({ _id: paramListId, boardId: paramBoardId, archived: false }),
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/lists', function (req, res) {
|
||||
try {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const id = Lists.insert({
|
||||
title: req.body.title,
|
||||
boardId: paramBoardId,
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: id,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
JsonRoutes.add('DELETE', '/api/boards/:boardId/lists/:listId', function (req, res) {
|
||||
try {
|
||||
Authentication.checkUserId( req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramListId = req.params.listId;
|
||||
Lists.remove({ _id: paramListId, boardId: paramBoardId });
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: {
|
||||
_id: paramListId,
|
||||
},
|
||||
});
|
||||
}
|
||||
catch (error) {
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,82 @@
|
||||
# Change Role at Web UI
|
||||
|
||||
BoardAdmin can change role of user at right sidebar / click avatar / select role like Admin, Normal, etc.
|
||||
|
||||
# Change Role with API
|
||||
|
||||
- https://wekan.github.io/api/
|
||||
- api.py at https://github.com/wekan/wekan
|
||||
- Login to API https://github.com/wekan/wekan/wiki/REST-API#example-call---as-json
|
||||
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
## Add New Board Member with Role
|
||||
This example adds with normal role. See examples below for other roles.
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE/add \
|
||||
-d '{"action": "add","isAdmin": "false", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "false" }'
|
||||
```
|
||||
like
|
||||
```
|
||||
/api/boards/{boardid}/members/{MEMBERID}/add Body{ "action" : add, "isadmin" : false ...........
|
||||
```
|
||||
|
||||
## Remove Member from Board
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE/remove \
|
||||
-d '{"action": "remove"}'
|
||||
```
|
||||
|
||||
# Change Role of Existing Board Member
|
||||
|
||||
## Admin
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "true", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "false"}'
|
||||
```
|
||||
## Normal
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "false"}'
|
||||
```
|
||||
## No Comments
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"true", "isCommentOnly": "false", "isWorker": "false"}'
|
||||
```
|
||||
## Comment Only
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"false", "isCommentOnly": "true", "isWorker": "false"}'
|
||||
```
|
||||
## Worker
|
||||
- Can: move cards, can assign himself to card, can comment.
|
||||
- Cannot: anything else including revoke card, change settings, create/delete/edit cards/tags and so on...
|
||||
```
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/BOARD-ID-HERE/members/USER-ID-HERE \
|
||||
-d '{"isAdmin": "false", "isNoComments":"false", "isCommentOnly": "false", "isWorker": "true"}'
|
||||
```
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
# Retrieve cards by swimlane id
|
||||
|
||||
Please somebody add example by looking this:
|
||||
|
||||
[Issue](https://github.com/wekan/wekan/issues/1934) and [code](https://github.com/wekan/wekan/pull/1944/commits/be42b8d4cbdfa547ca019ab2dc9a590a115cc0e2). Also add to [Cards page](REST-API-Cards)
|
||||
|
||||
# Add Swimlane to Board
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/swimlanes](https://github.com/wekan/wekan/blob/main/models/swimlanes.js#L223) | `yes` | `POST` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/swimlanes \
|
||||
-d '{ "title": "Swimlane title text" }'
|
||||
```
|
||||
## Result example
|
||||
The new swimlane's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# Delete a swimlane
|
||||
|
||||
| API URL / Code Link | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| [/api/boards/:boardId/swimlanes/:swimlaneId](https://github.com/wekan/wekan/blob/main/models/swimlanes.js#L257) | `yes` | `DELETE` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X DELETE \
|
||||
http://localhost:3000/api/boards/YRgy7Ku6uLFv2pYwZ/lists/PgTuf6sFJsaxto5dC/cards/ssrNX9CvXvPxuC5DE
|
||||
```
|
||||
## Result example
|
||||
The swimlane's ID is returned in the format:
|
||||
```json
|
||||
{
|
||||
"_id": "W9m9YxQKT6zZrKzRW"
|
||||
}
|
||||
```
|
||||
|
||||
# In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/swimlanes.js "Swimlane API code")
|
||||
@@ -0,0 +1,335 @@
|
||||
# Disclaimer
|
||||
|
||||
This page tries to be as up to date as possible. If you see something wrong here, feel free to update the page and help other people like you, that greatly depends on our APIs. If you don't feel comfortable doing this kind of changes, please contact us by creating an [issue](https://github.com/wekan/wekan/issues/new).
|
||||
|
||||
# User Register
|
||||
| URL | Requires Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/users/register` | `no` | `POST` |
|
||||
|
||||
## Payload
|
||||
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `username` | `myusername` | Required | Your username |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
| `email` | `my@email.com` | Required | Your email |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call - As Form Data
|
||||
```bash
|
||||
curl http://localhost:3000/users/register \
|
||||
-d "username=myusername&password=mypassword&email=my@email.com"
|
||||
```
|
||||
|
||||
|
||||
## Example Call - As JSON
|
||||
```bash
|
||||
curl -H "Content-type:application/json" \
|
||||
http://localhost:3000/users/register \
|
||||
-d '{ "username": "myusername", "password": "mypassword", "email": "my@email.com" }'
|
||||
```
|
||||
|
||||
|
||||
## Result
|
||||
```json
|
||||
{
|
||||
"id": "user id",
|
||||
"token": "string",
|
||||
"tokenExpires": "ISO encoded date string"
|
||||
}
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"id": "XQMZgynx9M79qTtQc",
|
||||
"token": "ExMp2s9ML1JNp_l11sIfINPT3wykZ1SsVwg-cnxKdc8",
|
||||
"tokenExpires": "2017-12-15T00:47:26.303Z"
|
||||
}
|
||||
```
|
||||
|
||||
# User Create
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users` | `yes` | `POST` |
|
||||
|
||||
## Payload
|
||||
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `username` | `myusername` | Required | Your username |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
| `email` | `my@email.com` | Required | Your email |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call - As Form Data
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/users \
|
||||
-d "username=myusername&password=mypassword&email=my@email.com"
|
||||
```
|
||||
|
||||
## Example Call - As JSON
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://localhost:3000/api/users \
|
||||
-d '{ "username": "myusername", "password": "mypassword", "email": "my@email.com" }'
|
||||
```
|
||||
|
||||
## Example of all steps of create user
|
||||
|
||||
1) Login
|
||||
|
||||
```
|
||||
curl http://example.com/users/login \
|
||||
-d "username=YOUR-USERNAME-HERE&password=YOUR-PASSWORD-HERE"
|
||||
```
|
||||
|
||||
As response you get your id and token:
|
||||
|
||||
```
|
||||
"id":"YOUR-ID-HERE","token":"YOUR-TOKEN-HERE","tokenExpires":"2017-12-23T21:07:10.395Z"}
|
||||
```
|
||||
|
||||
2) Create user. Works both when serf-register enabled and disabled.
|
||||
|
||||
```
|
||||
curl -H "Authorization: Bearer YOUR-TOKEN-HERE" \
|
||||
-H "Content-type:application/json" \
|
||||
-X POST \
|
||||
http://example.com/api/users \
|
||||
-d '{ "username": "tester", "password": "tester", "email": "tester@example.com", "fromAdmin": "true" }'
|
||||
```
|
||||
|
||||
As reply you get new user's id.
|
||||
|
||||
```
|
||||
{"id":"NEW-USER-ID-HERE"}
|
||||
```
|
||||
|
||||
3) You can get user details with your new user's id:
|
||||
|
||||
```
|
||||
curl -H "Authorization: Bearer YOUR-TOKEN-HERE" \
|
||||
http://example.com/api/users/NEW-USER-ID-HERE
|
||||
```
|
||||
|
||||
## Result
|
||||
|
||||
Returns the id of the created user.
|
||||
|
||||
|
||||
```json
|
||||
{
|
||||
"_id": "user id"
|
||||
}
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"_id": "EnhMbvxh65Hr7YvtG"
|
||||
}
|
||||
```
|
||||
|
||||
# User Delete
|
||||
|
||||
> IMPORTANT : Should not be used as long as [this bug](https://github.com/wekan/wekan/issues/1289) exists.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `DELETE` |
|
||||
|
||||
## Parameters
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `id` | `BsNr28znDkG8aeo7W` | Required | The id of the user to delete. |
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
-X DELETE \
|
||||
http://localhost:3000/api/users/EnhMbvxh65Hr7YvtG
|
||||
```
|
||||
|
||||
## Example Result
|
||||
|
||||
Returns the id of the deleted user.
|
||||
|
||||
```json
|
||||
{
|
||||
"_id": "EnhMbvxh65Hr7YvtG"
|
||||
}
|
||||
```
|
||||
|
||||
# User Information
|
||||
Retrieves information about a user.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `GET` |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
* **Only the admin user (the first user) can call the REST API.**
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
http://localhost:3000/api/users/XQMZgynx9M79qTtQc
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"_id": "XQMZgynx9M79qTtQc",
|
||||
"createdAt": "2017-09-13T06:45:53.127Z",
|
||||
"services": {
|
||||
"password": {
|
||||
"bcrypt": "$2a$10$CRZrpT4x.VpG2FdJxR3rN.9m0NbQb0OPsSPBDAZukggxrskMtWA8."
|
||||
},
|
||||
"email": {
|
||||
"verificationTokens": [
|
||||
{
|
||||
"token": "8rzwpq_So2PVYHVSfrcc5f5QZnuV2wEtu7QRQGwOJx8",
|
||||
"address": "my@email.com",
|
||||
"when": "2017-09-13T06:45:53.157Z"
|
||||
}
|
||||
]
|
||||
},
|
||||
"resume": {
|
||||
"loginTokens": [
|
||||
{
|
||||
"when": "2017-09-13T06:45:53.265Z",
|
||||
"hashedToken": "CY/PWeDa3fAkl+k94+GWzCtpB5nPcVxLzzzjXs4kI3A="
|
||||
},
|
||||
{
|
||||
"when": "2017-09-16T06:06:19.741Z",
|
||||
"hashedToken": "74MQNXfsgjkItx/gpgPb29Y0MSNAvBrsnSGQmr4YGvQ="
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"username": "john",
|
||||
"emails": [
|
||||
{
|
||||
"address": "my@email.com",
|
||||
"verified": false
|
||||
}
|
||||
],
|
||||
"isAdmin": true,
|
||||
"profile": {}
|
||||
}
|
||||
```
|
||||
# User List
|
||||
Retrieves the user list.
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users` | `yes` | `GET` |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
* **Only the admin user (the first user) can call the REST API.**
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer cwUZ3ZsTaE6ni2R3ppSkYd-KrDvxsLcBIkSVfOCfIkA" \
|
||||
http://localhost:3000/api/users
|
||||
```
|
||||
|
||||
## Result
|
||||
```json
|
||||
[
|
||||
{
|
||||
"_id": "user id",
|
||||
"username": "string"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
[
|
||||
{
|
||||
"_id": "XQMZgynx9M79qTtQc",
|
||||
"username": "admin"
|
||||
},
|
||||
{
|
||||
"_id": "vy4WYj7k7NBhf3AFc",
|
||||
"username": "john"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
# User Logged-in
|
||||
Retrieves information about a logged-in user with his auth token.
|
||||
|
||||
| URL | Requires Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/user` | `yes` | `GET` |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call
|
||||
```bash
|
||||
curl -H "Authorization: Bearer a6DM_gOPRwBdynfXaGBaiiEwTiAuigR_Fj_81QmNpnf" \
|
||||
http://localhost:3000/api/user
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"_id": "vy4WYj7k7NBhf3AFc",
|
||||
"createdAt": "2017-09-16T05:51:30.339Z",
|
||||
"username": "john",
|
||||
"emails": [
|
||||
{
|
||||
"address": "me@mail.com",
|
||||
"verified": false
|
||||
}
|
||||
],
|
||||
"profile": {}
|
||||
}
|
||||
```
|
||||
|
||||
# Disable a user (the user is not allowed to login and his login tokens are purged)
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/users/ztKvBTzCqmyJ77on8 \
|
||||
-d '{ "action": "disableLogin" }'
|
||||
```
|
||||
|
||||
# Enable a user
|
||||
|
||||
| URL | Requires Admin Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/api/users/:id` | `yes` | `PUT` |
|
||||
|
||||
```shell
|
||||
curl -H "Authorization: Bearer t7iYB86mXoLfP_XsMegxF41oKT7iiA9lDYiKVtXcctl" \
|
||||
-H "Content-type:application/json" \
|
||||
-X PUT \
|
||||
http://localhost:3000/api/users/ztKvBTzCqmyJ77on8 \
|
||||
-d '{ "action": "enableLogin" }'
|
||||
```
|
||||
|
||||
# In Wekan code
|
||||
|
||||
If you believe that code is the best documentation, be our guest: [models/cards.js](https://github.com/wekan/wekan/blob/main/models/users.js "User API code")
|
||||
@@ -0,0 +1,126 @@
|
||||
REST API is not complete yet, please add missing functionality with pull requests to devel branch.
|
||||
|
||||
If you are in a hurry, you can use these to have more functionality:
|
||||
* https://restheart.org
|
||||
* http://vulcanjs.org
|
||||
|
||||
For workflows see [If-this-then-that issue](https://github.com/wekan/wekan/issues/1160) than mentions Huginn, Flogo etc.
|
||||
|
||||
# Wekan REST API
|
||||
|
||||
The REST API allows you to control and extend Wekan with ease.
|
||||
|
||||
If you are an end-user and not a dev or a tester, [create an issue](https://github.com/wekan/wekan/issues/new) to request new APIs.
|
||||
|
||||
> All API calls in the documentation are made using `curl`. However, you are free to use Java / Python / PHP / Golang / Ruby / Swift / Objective-C / Rust / Scala / C# or any other programming languages.
|
||||
|
||||
## Production Security Concerns
|
||||
When calling a production Wekan server, ensure it is running via HTTPS and has a valid SSL Certificate. The login method requires you to post your username and password in plaintext, which is why we highly suggest only calling the REST login api over HTTPS. Also, few things to note:
|
||||
|
||||
* Only call via HTTPS
|
||||
* Implement a timed authorization token expiration strategy
|
||||
* Ensure the calling user only has permissions for what they are calling and no more
|
||||
|
||||
# Summary
|
||||
|
||||
### Authentication
|
||||
| HTTP Method | Url | Short Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `POST` | `/users/login` | [Authenticate with the REST API.](#login) |
|
||||
|
||||
### Users
|
||||
| HTTP Method | Url | Short Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `POST` | `/users/register` | [Register a new user.](REST-API-User#user-register) |
|
||||
| `POST` | `/api/users` | [Create a new user.](REST-API-User#user-create) |
|
||||
| `PUT` | `/api/users/:id` | [Disable an existing user.](REST-API-User#disable-a-user-the-user-is-not-allowed-to-login-and-his-login-tokens-are-purged) |
|
||||
| `PUT` | `/api/users/:id` | [Enable an existing user.](REST-API-User#enable-a-user) |
|
||||
| `PUT` | `/api/users/:id` | [Admin takes the ownership.](REST-API-User#the-admin-takes-the-ownership-of-all-boards-of-the-user-archived-and-not-archived-where-the-user-is-admin-on) |
|
||||
| `DELETE` | `/api/users/:id` | [Delete an existing user.](REST-API-User#user-delete) ([Warning](https://github.com/wekan/wekan/issues/1289))|
|
||||
| `GET` | `/api/users/:id` | [Gets a user's information.](REST-API-User#user-information) |
|
||||
| `GET` | `/api/users` | [All of the users.](REST-API-User#user-list) |
|
||||
| `GET` | `/api/user` | [Gets a logged-in user.](REST-API-User#user-logged-in) |
|
||||
### Cards
|
||||
| HTTP Method | Url | Short Description |
|
||||
| :--- | :--- | :--- |
|
||||
| `POST` | `/api/boards/:boardId/lists/:listId/cards` | [Add a card to a list, board, and swimlane.](REST-API-Cards#add-card-to-list-board-swimlane) |
|
||||
| `PUT` | `/api/boards/:boardId/lists/:fromListId/cards/:cardId` | [Update a card.](REST-API-Cards#update-a-card) |
|
||||
| `DELETE` | `/api/boards/:boardId/lists/:listId/cards/:cardId` | [Delete a card.](REST-API-Cards#update-a-card) |
|
||||
|
||||
|
||||
---
|
||||
|
||||
# Login
|
||||
| URL | Requires Auth | HTTP Method |
|
||||
| :--- | :--- | :--- |
|
||||
| `/users/login` | `no` | `POST` |
|
||||
|
||||
## Payload
|
||||
|
||||
### Authentication with username
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `username` | `myusername` | Required | Your username |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
|
||||
### Authentication with email
|
||||
| Argument | Example | Required | Description |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `email` | `my@email.com` | Required | Your email |
|
||||
| `password` | `my$up3erP@ssw0rd` | Required | Your password |
|
||||
|
||||
* Notes:
|
||||
* **You will need to provide the `token` for any of the authenticated methods.**
|
||||
|
||||
## Example Call - As Form Data
|
||||
|
||||
DOES NOT WORK ! Please use As JSON example below !
|
||||
https://github.com/wekan/wekan/issues/4807
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/users/login \
|
||||
-d "username=myusername&password=mypassword"
|
||||
```
|
||||
|
||||
```bash
|
||||
curl http://localhost:3000/users/login \
|
||||
-d "email=my@email.com&password=mypassword"
|
||||
```
|
||||
|
||||
|
||||
## Example Call - As JSON
|
||||
|
||||
THIS WORKS !! Alternatively, look at api.py example at https://github.com/wekan/wekan
|
||||
|
||||
NOTE: Username and password is case sensitive. So type BIG and small letters correctly.
|
||||
|
||||
```bash
|
||||
curl -H "Content-type:application/json" \
|
||||
http://localhost:3000/users/login \
|
||||
-d '{ "username": "myusername", "password": "mypassword" }'
|
||||
```
|
||||
|
||||
```bash
|
||||
curl -H "Content-type:application/json" \
|
||||
http://localhost:3000/users/login \
|
||||
-d '{ "email": "my@email.com", "password": "mypassword" }'
|
||||
```
|
||||
|
||||
|
||||
## Result
|
||||
```json
|
||||
{
|
||||
"id": "user id",
|
||||
"token": "string",
|
||||
"tokenExpires": "ISO encoded date string"
|
||||
}
|
||||
```
|
||||
|
||||
## Result example
|
||||
```json
|
||||
{
|
||||
"id": "XQMZgynx9M79qTtQc",
|
||||
"token": "ExMp2s9ML1JNp_l11sIfINPT3wykZ1SsVwg-cnxKdc8",
|
||||
"tokenExpires": "2017-12-15T00:47:26.303Z"
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,8 @@
|
||||
Admin Panel / People / Click at right side of usename `...` button that is User Settings / Impersonate user.
|
||||
|
||||
You will be switched to logged in as that user.
|
||||
|
||||
To switch back to your original user, at your webbrowser click `Reload open webpage` round arrow button.
|
||||
|
||||
This feature was added to Wekan v4.39 at https://github.com/wekan/wekan/pull/3280
|
||||
|
||||
@@ -0,0 +1,784 @@
|
||||
[Sandstorm](Sandstorm) - [Sandstorm Backup](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
# Upcoming
|
||||
|
||||
[Transferring to Minio and SQLite](https://github.com/wekan/minio-metadata)
|
||||
|
||||
# Backup Docker
|
||||
|
||||
[Also see: Upgrading Synology with Wekan quay images](https://github.com/wekan/wekan/issues/3874#issuecomment-867526249)
|
||||
|
||||
Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/.
|
||||
|
||||
[docker-compose.yml](https://raw.githubusercontent.com/wekan/wekan/master/docker-compose.yml)
|
||||
|
||||
This presumes your Wekan Docker is currently running with:
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
Backup to directory dump:
|
||||
```bash
|
||||
docker stop wekan-app
|
||||
docker exec wekan-db rm -rf /data/dump
|
||||
docker exec wekan-db mongodump -o /data/dump
|
||||
docker cp wekan-db:/data/dump .
|
||||
docker start wekan-app
|
||||
```
|
||||
Copy dump directory to other server or to your backup.
|
||||
|
||||
# Restore Docker
|
||||
```bash
|
||||
docker stop wekan-app
|
||||
docker exec wekan-db rm -rf /data/dump
|
||||
docker cp dump wekan-db:/data/
|
||||
docker exec wekan-db mongorestore --drop --dir=/data/dump
|
||||
docker start wekan-app
|
||||
```
|
||||
# Upgrade Docker Wekan version
|
||||
|
||||
## Newest info
|
||||
|
||||
https://github.com/wekan/wekan/discussions/5367
|
||||
|
||||
## Old info
|
||||
|
||||
Note: Do not run `docker-compose down` without verifying your docker-compose file, it does not delete the data by default but caution is advised. Refer to https://docs.docker.com/compose/reference/down/.
|
||||
```bash
|
||||
docker-compose stop
|
||||
docker rm wekan-app
|
||||
```
|
||||
a) For example, if you in docker-compose.yml use `image: wekanteam/wekan` or `image: quay.io/wekan/wekan` for latest development version
|
||||
|
||||
b) Or in docker-compose.yml change version tag, or use version tag like `image: wekanteam/wekan:v5.50` or `image: quay.io/wekan/wekan:v5.50`
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
# Backup Wekan Snap to directory dump
|
||||
```bash
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="/snap/wekan/current/bin:$PATH"
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan > snap-settings.sh
|
||||
```
|
||||
NOTE for Arch Linux: Use this path instead. [Source](https://github.com/wekan/wekan/issues/3941).
|
||||
```bash
|
||||
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH-}:/var/lib/snapd/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
```
|
||||
username is your /home/username
|
||||
```bash
|
||||
sudo chown username:username snap-settings.sh
|
||||
sudo snap start wekan.wekan
|
||||
```
|
||||
Modify snap-settings.sh so that it has commands like:
|
||||
```bash
|
||||
sudo snap set wekan root-url='http://localhost'
|
||||
```
|
||||
Set snap-settings.sh executeable:
|
||||
```bash
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
|
||||
# Restore Wekan Snap
|
||||
```bash
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
mongorestore --drop --port 27019
|
||||
sudo snap start wekan.wekan
|
||||
./snap-settings.sh
|
||||
```
|
||||
# Upgrade Snap manually immediately (usually it updates automatically)
|
||||
|
||||
```bash
|
||||
sudo snap refresh
|
||||
```
|
||||
|
||||
# Backup Wekan Gantt GPLv2 Snap to directory dump
|
||||
```bash
|
||||
sudo snap stop wekan-gantt-gpl.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan-gantt-gpl/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan-gantt-gpl/current/bin"
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan-gantt-gpl > snap-settings.sh
|
||||
```
|
||||
username is your /home/username
|
||||
```bash
|
||||
sudo chown username:username snap-settings.sh
|
||||
sudo snap start wekan-gantt-gpl.wekan
|
||||
```
|
||||
Modify snap-settings.sh so that it has command like:
|
||||
```bash
|
||||
sudo snap set wekan-gantt-gpl root-url='http://localhost'
|
||||
```
|
||||
Set snap-settings.sh executeable:
|
||||
```bash
|
||||
chmod +x snap-settings.sh
|
||||
```
|
||||
|
||||
# Restore Wekan Gantt GPLv2 Snap
|
||||
```bash
|
||||
sudo snap stop wekan-gantt-gpl.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan-gantt-gpl/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan-gantt-gpl/current/bin"
|
||||
mongorestore --drop --port 27019
|
||||
sudo snap start wekan-gantt-gpl.wekan
|
||||
./snap-settings.sh
|
||||
```
|
||||
|
||||
# DBGate, Open Source MongoDB GUI
|
||||
|
||||
https://dbgate.org - https://github.com/dbgate/dbgate
|
||||
|
||||
# Using nosqlbooster closed source MongoDB GUI with Wekan Snap to edit MongoDB database
|
||||
|
||||
https://nosqlbooster.com/downloads
|
||||
|
||||
### At server where Wekan Snap is installed, MongoDB is running at localhost port 27019
|
||||
|
||||
<img src="https://wekan.github.io/nosqlbooster-basic-connection.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
### You can tunnel via SSH to server, using password auth or private key auth dropdown selection
|
||||
|
||||
<img src="https://wekan.github.io/nosqlbooster-ssh-tunnel.png" width="60%" alt="Wekan logo" />
|
||||
|
||||
# Scheduled backups to local or remote server
|
||||
|
||||
For below scheduled backup scripts, no info from above of this wiki page is required. Backup scripts below have the required settings.
|
||||
|
||||
This does backup of [Wekan+RocketChat snap databases](OAuth2) and php website etc.
|
||||
|
||||
If you need to backup some remote server or cloud, you can use scp, or read [rclone docs](https://rclone.org/docs/) about how to configure saving to some other remote server or cloud.
|
||||
|
||||
The following .sh bash scripts are added as root user to your `/root/` directory.
|
||||
|
||||
Backups are created to subdirectories of `/root/backups/`.
|
||||
|
||||
Cron is used to schedule backups, for example once a day.
|
||||
|
||||
1. To add bash scripts, you change to root user with this command, and your sudo or root password.
|
||||
```bash
|
||||
sudo su
|
||||
```
|
||||
2. Use nano editor for editing cron. If you don't have it installed, type:
|
||||
```bash
|
||||
apt install nano
|
||||
```
|
||||
3. Then we set text editor to be nano. Otherwise it probably uses vi, that is harder to use.
|
||||
```bash
|
||||
export EDITOR=nano
|
||||
```
|
||||
4. Now we start editing cron scheduler.
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
For more info how to make cron time, see https://crontab.guru
|
||||
|
||||
In this example, we set backups every day at 04:00, then it runs backup.sh script, and saves output of the backup commands to the bottom of textfile backup.log.txt
|
||||
```bash
|
||||
# m h dom mon dow command
|
||||
0 4 * * * /root/backup.sh >> /root/backup.log.txt 2>&1
|
||||
```
|
||||
- For changing to `/root` directory, type: `cd /root`
|
||||
- for editing backup.sh file, type: `nano backup.sh`
|
||||
- For saving in nano, press Ctrl-o Enter
|
||||
- For exiting nano, press Ctrl-x Enter
|
||||
- Set every .sh file as executeable, for example: `chmod +x backup.sh`
|
||||
|
||||
This is content of `backup.sh` script. It runs all the other backup scripts.
|
||||
If you do not need to backup rocketchat or website, or do not need to use rclone,
|
||||
you don't need to add those command lines at all.
|
||||
```bash
|
||||
cd /root
|
||||
./backup-wekan.sh
|
||||
./backup-rocketchat.sh
|
||||
./backup-website.sh
|
||||
rclone move backups cloudname:backup.example.com
|
||||
```
|
||||
More about rclone:
|
||||
|
||||
/root/rclone-ls-all.sh , shows directory contests at cloud:
|
||||
```bash
|
||||
rclone lsd cloudname:
|
||||
```
|
||||
In this example, cron does run backup scripts as root.
|
||||
This is if you edit cron with command `crontab -e` as root user,
|
||||
so it edits the cron of root user.
|
||||
|
||||
If mongodump command works as normal user for you, you could instead
|
||||
run backups as normal user, by exiting root user with `exit` and
|
||||
then as normal user editing cron with `crontab -e`.
|
||||
You can also list current cron with command `crontab -l`.
|
||||
|
||||
If you like to backup Wekan snap settings with this command, then it
|
||||
only works with sudo at front, or as a root user without sudo at front.
|
||||
```bash
|
||||
sudo snap get wekan > snap-settings.txt
|
||||
```
|
||||
|
||||
This below is backup script for backing up Wekan.
|
||||
|
||||
/root/backup-wekan.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
# Backups will be created below this directory.
|
||||
backupdir="/root/backups/wekan"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Gets current time to variable "now"
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
|
||||
# Creates new backup directory like BACKUPDIR/BACKUPVERSIO-TIMENOW
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
#dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Changes to backup directory
|
||||
cd $backupdir/$version-$now
|
||||
|
||||
# Backup Caddy settings
|
||||
snap get wekan > snap-settings.txt
|
||||
|
||||
# Show text that database backup is in progress
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
|
||||
# Backup to current directory, creates subdirectory called "dump"
|
||||
# with database dump files
|
||||
mongodump --port 27019
|
||||
|
||||
# Change diretory (=cd) to parent directory
|
||||
cd ..
|
||||
|
||||
# Show text "Makes the tar.gz archive file"
|
||||
printf "\nMakes the tar.gz archive file.\n"
|
||||
|
||||
# Creates tar.gz archive file. This works similarly like creating .zip file.
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Delete temporary files that have already been
|
||||
# compressed to above tar.gz file
|
||||
rm -rf $version-$now
|
||||
|
||||
# Shows text "Backup done."
|
||||
printf "\nBackup done.\n"
|
||||
|
||||
# Show where backup archive file is.
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```bash
|
||||
/root/backup-rocketchat.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
backupdir="/root/backups/rocketchat"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Makes the backup.
|
||||
cd $backupdir/$version-$now
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
$dump --port 27017
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```
|
||||
/root/backup-website.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
|
||||
backupdir="/root/backups/example.com"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p $backupdir/$version-$now
|
||||
|
||||
# Makes the backup.
|
||||
cd $backupdir/$version-$now
|
||||
printf "\nThe file backup is in progress.\n\n"
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
cp -pR /var/snap/wekan/common/example.com $version-$now
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at $backupdir/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
```
|
||||
/var/snap/wekan/common/Caddyfile
|
||||
```bash
|
||||
chat.example.com {
|
||||
proxy / localhost:3000 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
https://boards.example.com {
|
||||
proxy / localhost:3001 {
|
||||
websocket
|
||||
transparent
|
||||
}
|
||||
}
|
||||
|
||||
example.com {
|
||||
root /var/snap/wekan/common/example.com
|
||||
fastcgi / /var/run/php/php7.0-fpm.sock php
|
||||
}
|
||||
|
||||
matomo.example.com {
|
||||
root /var/snap/wekan/common/matomo.example.com
|
||||
fastcgi / /var/run/php/php7.0-fpm.sock php
|
||||
}
|
||||
|
||||
# Example CloudFlare free wildcard SSL Origin Certificate, there is example.com.pem at certificates directory with private key at to and cert at bottom.
|
||||
http://example.com https://example.com {
|
||||
tls {
|
||||
load /var/snap/wekan/common/certificates
|
||||
alpn http/1.1
|
||||
}
|
||||
root /var/snap/wekan/common/example.com
|
||||
browse
|
||||
}
|
||||
|
||||
static.example.com {
|
||||
root /var/snap/wekan/common/static.example.com
|
||||
}
|
||||
```
|
||||
|
||||
## Related talk about MongoDB backup
|
||||
|
||||
Related talk, search for "mongodb" this page:
|
||||
https://fosdem.org/2020/schedule/events/
|
||||
|
||||
There is this:
|
||||
|
||||
Percona Backup for MongoDB: Status and Plans
|
||||
|
||||
Open Source solution for consistent backups of multi-shard MongoDB
|
||||
|
||||
- [Slides](https://fosdem.org/2020/schedule/event/perconamongodb/attachments/slides/3768/export/events/attachments/perconamongodb/slides/3768/Percona_Backup_for_MongoDB.pdf)
|
||||
- [Video webm](https://video.fosdem.org/2020/UD2.119/perconamongodb.webm)
|
||||
- [Same Video mp4](https://video.fosdem.org/2020/UD2.119/perconamongodb.mp4)
|
||||
|
||||
## Related Sandstorm issue
|
||||
|
||||
[Creating a backup while the grain is running could cause corruption](https://github.com/sandstorm-io/sandstorm/issues/3186).
|
||||
|
||||
## Combining old and new Wekan version data
|
||||
|
||||
Note: Do mongodump/mongorestore only when Wekan is stopped: wekan.wekan (Snap) or wekan-app (Docker).
|
||||
|
||||
1. From new Wekan export all boards to Wekan JSON.
|
||||
2. Backup new Wekan with mongodump.
|
||||
3. Backup old Wekan with mongodump.
|
||||
4. Restore old Wekan data to new Wekan with mongorestore.
|
||||
5. Restore new Wekan JSON exported boards by importing them.
|
||||
|
||||
## Rescuing board that does not load
|
||||
|
||||
Wekan web UI Import/Export JSON does not have all content currently. To upgrade from old Wekan version, use mongodump/mongorestore to newest Wekan, like described below.
|
||||
|
||||
To import big JSON file, on Linux you can use xclip to copy textfile to clipboard:
|
||||
```bash
|
||||
sudo apt-get install xclip
|
||||
cat board.json | xclip -se c
|
||||
```
|
||||
Then paste to webbrowser Wekan Add Board / Import / From previous export.
|
||||
|
||||
You can [save all MongoDB database content as JSON files](Export-from-Wekan-Sandstorm-grain-.zip-file). Files are base64 encoded in JSON files.
|
||||
|
||||
Export board to Wekan JSON, and import as Wekan JSON can make some part of board to load, but you should check is some data missing.
|
||||
|
||||
With Wekan Snap, you can use [nosqlbooster GUI](https://nosqlbooster.com/downloads) to login through SSH to Wekan server localhost port 27019 and browse data.
|
||||
|
||||
You could use [daff](https://github.com/paulfitz/daff) to compare tables.
|
||||
|
||||
## Using Snap Mongo commands on your bash CLI
|
||||
|
||||
Add to your `~/.bashrc`
|
||||
```bash
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH="$PATH:/snap/wekan/current/bin"
|
||||
```
|
||||
Then you can backup:
|
||||
```bash
|
||||
mongodump --port 27019
|
||||
```
|
||||
And restore:
|
||||
```bash
|
||||
mongorestore --drop --port 27019
|
||||
```
|
||||
|
||||
## MongoDB shell on Wekan Snap
|
||||
|
||||
mongoshell.sh
|
||||
```bash
|
||||
#/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
mongo=$"/snap/wekan/$version/bin/mongo"
|
||||
$mongo --port 27019
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Snap backup-restore v2
|
||||
|
||||
Originally from https://github.com/wekan/wekan-snap/issues/62#issuecomment-470622601
|
||||
|
||||
## Backup
|
||||
|
||||
wekan-backup.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
now=$(date +"%Y%m%d-%H%M%S")
|
||||
parent_dir="/data/backups/wekan"
|
||||
backup_dir="${parent_dir}/${now}"
|
||||
log_file="${parent_dir}/backup-progress.log.${now}"
|
||||
|
||||
error () {
|
||||
printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
trap 'error "An unexpected error occurred."' ERR
|
||||
|
||||
take_backup () {
|
||||
mkdir -p "${backup_dir}"
|
||||
|
||||
cd "${backup_dir}"
|
||||
|
||||
/snap/wekan/$version/bin/mongodump --quiet --port 27019
|
||||
|
||||
cd ..
|
||||
|
||||
tar -zcf "${now}.tar.gz" "${now}"
|
||||
|
||||
rm -rf "${now}"
|
||||
}
|
||||
|
||||
printf "\n======================================================================="
|
||||
printf "\nWekan Backup"
|
||||
printf "\n======================================================================="
|
||||
printf "\nBackup in progress..."
|
||||
|
||||
take_backup 2> "${log_file}"
|
||||
|
||||
if [[ -s "${log_file}" ]]
|
||||
then
|
||||
printf "\nBackup failure! Check ${log_file} for more information."
|
||||
printf "\n=======================================================================\n\n"
|
||||
else
|
||||
rm "${log_file}"
|
||||
printf "...SUCCESS!\n"
|
||||
printf "Backup created at ${backup_dir}.tar.gz"
|
||||
printf "\n=======================================================================\n\n"
|
||||
fi
|
||||
```
|
||||
wekan-restore.sh
|
||||
```bash
|
||||
#!/bin/bash
|
||||
export LC_ALL=C
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
makesRestore()
|
||||
{
|
||||
file=$1
|
||||
|
||||
ext=$"$(basename $file)"
|
||||
parentDir=$"${file:0:${#file}-${#ext}}"
|
||||
cd "${parentDir}"
|
||||
|
||||
printf "\nMakes the untar of the archive.\n"
|
||||
|
||||
tar -zxvf "${file}"
|
||||
file="${file:0:${#file}-7}"
|
||||
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
restore=$"/snap/wekan/${version}/bin/mongorestore"
|
||||
|
||||
printf "\nThe database restore is in progress.\n\n"
|
||||
|
||||
## Only if you get errors about existing indexes, use this below instead:
|
||||
## $restore --quiet --drop --noIndexRestore -d wekan --port 27019 "${file}/dump/wekan"
|
||||
|
||||
$restore --quiet --drop -d wekan --port 27019 "${file}/dump/wekan"
|
||||
|
||||
rm -rf "${file}"
|
||||
|
||||
printf "\nRestore done.\n"
|
||||
}
|
||||
|
||||
makesRestore $1
|
||||
```
|
||||
|
||||
***
|
||||
|
||||
# Snap backup-restore v1
|
||||
|
||||
## Backup script for MongoDB Data, if running Snap MongoDB at port 27019
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makeDump()
|
||||
{
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Prepares.
|
||||
now=$(date +'%Y-%m-%d_%H.%M.%S')
|
||||
mkdir -p /var/backups/wekan/$version-$now
|
||||
|
||||
# Targets the dump file.
|
||||
dump=$"/snap/wekan/$version/bin/mongodump"
|
||||
|
||||
# Makes the backup.
|
||||
cd /var/backups/wekan/$version-$now
|
||||
printf "\nThe database backup is in progress.\n\n"
|
||||
$dump --port 27019
|
||||
|
||||
# Makes the tar.gz file.
|
||||
cd ..
|
||||
printf "\nMakes the tar.gz file.\n"
|
||||
tar -zcvf $version-$now.tar.gz $version-$now
|
||||
|
||||
# Cleanups
|
||||
rm -rf $version-$now
|
||||
|
||||
# End.
|
||||
printf "\nBackup done.\n"
|
||||
echo "Backup is archived to .tar.gz file at /var/backups/wekan/${version}-${now}.tar.gz"
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Starts
|
||||
makeDump
|
||||
|
||||
```
|
||||
|
||||
## Restore script for MongoDB Data, if running Snap MongoDB at port 27019 with a tar.gz archive.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
makesRestore()
|
||||
{
|
||||
# Prepares the folder used for the backup.
|
||||
file=$1
|
||||
if [[ "$file" != *tar.gz* ]]
|
||||
then
|
||||
echo "The backup archive must be a tar.gz."
|
||||
exit -1
|
||||
fi
|
||||
|
||||
# Goes into the parent directory.
|
||||
ext=$"$(basename $file)"
|
||||
parentDir=$"${file:0:${#file}-${#ext}}"
|
||||
cd $parentDir
|
||||
|
||||
# Untar the archive.
|
||||
printf "\nMakes the untar of the archive.\n"
|
||||
tar -zxvf $file
|
||||
file="${file:0:${#file}-7}"
|
||||
|
||||
# Gets the version of the snap.
|
||||
version=$(snap list | grep wekan | awk -F ' ' '{print $3}')
|
||||
|
||||
# Targets the dump file.
|
||||
restore=$"/snap/wekan/$version/bin/mongorestore"
|
||||
|
||||
# Restores.
|
||||
printf "\nThe database restore is in progress.\n\n"
|
||||
## Only if you get errors about existing indexes, use this below instead:
|
||||
## $restore --drop --noIndexRestore wekan --port 27019 $file/dump/wekan
|
||||
$restore --drop wekan --port 27019 $file/dump/wekan
|
||||
printf "\nRestore done.\n"
|
||||
|
||||
# Cleanups
|
||||
rm -rf $file
|
||||
}
|
||||
|
||||
# Checks is the user is sudo/root.
|
||||
if [ "$UID" -ne "0" ]
|
||||
then
|
||||
echo "This program must be launched with sudo/root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Start.
|
||||
makesRestore $1
|
||||
|
||||
```
|
||||
|
||||
## Docker Backup and Restore
|
||||
|
||||
[Docker Backup and Restore](Export-Docker-Mongo-Data)
|
||||
|
||||
[Wekan Docker Upgrade](https://github.com/wekan/wekan-mongodb#backup-before-upgrading)
|
||||
|
||||
## Snap Backup
|
||||
|
||||
[Snap Backup and Restore](https://github.com/wekan/wekan-snap/wiki/Backup-and-restore)
|
||||
|
||||
[Wekan Snap upgrade](https://github.com/wekan/wekan-snap/wiki/Install#5-install-all-snap-updates-automatically-between-0200am-and-0400am)
|
||||
|
||||
## Sandstorm Backup
|
||||
|
||||
Download Wekan grain with arrow down download button to .zip file. You can restore it later.
|
||||
|
||||
[Export data from Wekan Sandstorm grain .zip file](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
## <a name="cloudron">Cloudron
|
||||
|
||||
If those [Backup](Backup) ways are not easily found at [Cloudron](Cloudron), one way is to install [Redash](https://redash.io/) and then backup this way:
|
||||
|
||||
Redash works with this kind of queries:
|
||||
```json
|
||||
{
|
||||
"collection": "accountSettings",
|
||||
"query": {
|
||||
"type": 1
|
||||
},
|
||||
"fields": {
|
||||
"_id": 1,
|
||||
"booleanValue": 1,
|
||||
"createdAt": 1,
|
||||
"modifiedAt": 1,
|
||||
}
|
||||
}
|
||||
```
|
||||
So:
|
||||
|
||||
1) Create this kind of query:
|
||||
```json
|
||||
{
|
||||
"collection": "boards"
|
||||
}
|
||||
```
|
||||
|
||||
Later when you modify query, you can remove text like boards with double-click-with-mouse and delete-key-at-keyboard (or select characters with mouse and delete-key-at-keyboard), and then click collection/table >> button to insert name of next collection/table.
|
||||
|
||||
2) Click Save
|
||||
|
||||
3) Click Execute. This will cache query for use with REST API.
|
||||
|
||||
4) Click at right top `[...]` => `Show API key`
|
||||
|
||||
It looks like this:
|
||||
|
||||
https://redash.example.com/api/queries/1/results.json?api_key=...
|
||||
|
||||
5) Only when saving first collection/table, Save API key to text file script like this `dl.sh`
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Example: ./dl.sh boards
|
||||
|
||||
export APIKEY=https://redash.example.com/api/queries/1/results.json?api_key=...
|
||||
|
||||
curl -o $1.json $APIKEY
|
||||
```
|
||||
|
||||
6) Run save script like:
|
||||
```bash
|
||||
./dl.sh boards
|
||||
```
|
||||
Note: 1) Save 2) Execute => webbrowser can give this kind of timeout,
|
||||
but downloading with API script still works:
|
||||
|
||||
> wekan
|
||||
> Error running query: failed communicating with server. Please check your Internet connection and try again.
|
||||
|
||||
7) Repeat steps 1-4 and 6 for every collection/table like boards,cards, etc
|
||||
|
||||
8) Remove from downloaded .json files extra query related data, so that it is similar like [any other Wekan database backup JSON files](Export-from-Wekan-Sandstorm-grain-.zip-file)
|
||||
|
||||
9) Insert data to some other Wekan install with nosqlbooster like mentioned at page [Backup](Backup)
|
||||
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
# Upgrading
|
||||
|
||||
Newest WeKan uses MongoDB 6.0.3.
|
||||
|
||||
Current working way to upgrade is:
|
||||
|
||||
## Docker
|
||||
|
||||
1. Create Mongodump of your database like at [Backup page](https://github.com/wekan/wekan/wiki/Backup)
|
||||
2. Use newest WeKan docker-compose.yml from https://github.com/wekan/wekan with WRITABLE_PATH setup to Rclone/MinIO like below this page
|
||||
3. Mongorestore to MongoDB 6.0.3 database
|
||||
4. Use WeKan Admin Panel `Move all attachments to filesystem` button to move all attachments to MinIO.
|
||||
5. Create Mongodump, that this time does not have any attachments, and is much smaller.
|
||||
6. Mongorestore to MongoDB 6.0.3 database.
|
||||
7. Start WeKan.
|
||||
|
||||
## Snap
|
||||
|
||||
Similar Mongodump and Mongorestore above, with these info:
|
||||
- https://github.com/wekan/wekan-snap/wiki/Candidate-WeKan-Snap-Manual-Upgrade
|
||||
- https://github.com/wekan/wekan/issues/4780
|
||||
|
||||
# Introduction
|
||||
|
||||
With Rclone https://rclone.org , it's possible to use many cloud filesystems, like AWS S3, MinIO https://min.io , etc.
|
||||
|
||||
Newest WeKan has features to move files between MongoDB GridFS and filesystem.
|
||||
|
||||
Instead of filesystem, Rclone mounted cloud filesystem directory can be used, like MinIO.
|
||||
|
||||
## Screenshot 1: Move to filesystem button moves to cloud filesystem like MinIO. S3 button does not work yet.
|
||||
|
||||
Note: In some cases, only buttons `Move all attachments` at top are visible. In some other cases, there is more visible, like moving all attachments of board, etc, maybe when some have been already moved.
|
||||
|
||||
<img src="https://wekan.github.io/rclone/wekan-admin-panel.png" width="100%" alt="Wekan Admin Panel file move" />
|
||||
|
||||
## Screenshot 2: Files at MinIO after moving all to filesystem
|
||||
|
||||
<img src="https://wekan.github.io/rclone/minio1.png" width="100%" alt="MinIO 1" />
|
||||
|
||||
## Screenshot 3: Files at MinIO after moving all to filesystem
|
||||
|
||||
<img src="https://wekan.github.io/rclone/minio2.png" width="100%" alt="MinIO 2" />
|
||||
|
||||
## Rclone config
|
||||
|
||||
Create config for example with command:
|
||||
```
|
||||
rclone config
|
||||
```
|
||||
At S3 providers, there is MinIO at https://rclone.org/s3/#minio
|
||||
|
||||
`/root/.config/rclone/rclone.conf`
|
||||
|
||||
```
|
||||
[aws]
|
||||
type = s3
|
||||
provider = AWS
|
||||
access_key_id = ACCESS-KEY-HERE
|
||||
secret_access_key = SECRET-KEY-HERE
|
||||
region = eu-north-1
|
||||
location_constraint = eu-north-1
|
||||
acl = private
|
||||
|
||||
[minio]
|
||||
type = s3
|
||||
provider = Minio
|
||||
access_key_id = ACCESS-KEY-HERE
|
||||
secret_access_key = SECRET-KEY-HERE
|
||||
endpoint = http://192.168.0.100:9000
|
||||
acl = private
|
||||
```
|
||||
## Listing files with Rclone
|
||||
```
|
||||
rclone ls aws:
|
||||
|
||||
rclone ls minio:
|
||||
```
|
||||
## MinIO config
|
||||
|
||||
https://min.io
|
||||
|
||||
Running MinIO server binary, storing files at `/home/wekan/minio/data`
|
||||
```
|
||||
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /home/wekan/minio/data --console-address ":9001"
|
||||
```
|
||||
Create bucket, access key, secret key. Then connect them with `mc` command installed from https://min.io website, here bucket wekan:
|
||||
```
|
||||
mc config host add wekan http://192.168.0.100:9000 ACCESS-KEY-HERE SECRET-KEY-HERE
|
||||
```
|
||||
## Snap
|
||||
This uses minimal cache to make it work. Note that Rclone stays at foreground running, showing related messages, it does not daemonize to background.
|
||||
```
|
||||
sudo su
|
||||
|
||||
rclone mount minio:wekan/files /var/snap/wekan/common/files --vfs-cache-mode minimal
|
||||
```
|
||||
Sometimes it shows this kind of message:
|
||||
```
|
||||
2022/12/27 10:22:13 NOTICE: S3 bucket wekan path files: Streaming uploads using chunk size 5Mi will have maximum file size of 48.828Gi
|
||||
```
|
||||
## Docker
|
||||
|
||||
Rclone, short story:
|
||||
```
|
||||
sudo su
|
||||
|
||||
rclone mount minio:wekan/files /var/lib/docker/volumes/wekan_wekan-files/_data --vfs-cache-mode minimal
|
||||
```
|
||||
Longer story:
|
||||
|
||||
`docker-compose.yml` at https://github.com/wekan/wekan
|
||||
```
|
||||
- WRITABLE_PATH=/data
|
||||
```
|
||||
Docker volumes are there:
|
||||
```
|
||||
sudo ls /var/lib/docker/volumes/
|
||||
|
||||
wekan_wekan-db-dump
|
||||
wekan_wekan-db
|
||||
wekan_wekan-files
|
||||
```
|
||||
Directories there are:
|
||||
```
|
||||
/var/lib/docker/volumes/_data/attachments
|
||||
/var/lib/docker/volumes/_data/avatars
|
||||
```
|
||||
## Bundle or Source
|
||||
|
||||
Set `WRITABLE_PATH`like in Docker example above.
|
||||
|
||||
## Development
|
||||
|
||||
In Progress direct support without Rclone, if getting it working sometime.
|
||||
|
||||
Meteor-Files currently uses official AWS-SDK that does not yet directly support custom endpoint like MinIO:
|
||||
- https://github.com/veliovgroup/Meteor-Files/issues/862
|
||||
- https://github.com/veliovgroup/Meteor-Files/blob/master/docs/aws-s3-integration.md
|
||||
- https://github.com/wekan/wekan/issues/142#issuecomment-1365249290
|
||||
|
||||
MinIO code examples:
|
||||
- https://github.com/minio/minio-js/tree/master/examples
|
||||
|
||||
Related RocketChat docs about MinIO:
|
||||
- https://docs.rocket.chat/guides/administration/admin-panel/settings/file-upload/minio
|
||||
- https://github.com/RocketChat/Rocket.Chat/tree/develop/apps/meteor/app/file-upload
|
||||
- https://github.com/RocketChat/Rocket.Chat/pulls?q=is%3Apr+minio+is%3Aclosed
|
||||
|
||||
Storage path during developing WeKan, for example:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
rclone mount minio:wekan/files /home/wekan/repos/wekan/.meteor/local/.build-garbage-uslyxi.uokel/programs --vfs-cache-mode minimal
|
||||
```
|
||||
@@ -0,0 +1,165 @@
|
||||
## Repair Snap WeKan
|
||||
|
||||
```
|
||||
sudo su
|
||||
|
||||
snap stop wekan
|
||||
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
|
||||
export PATH="/snap/wekan/current/bin:$PATH"
|
||||
|
||||
mongod --dbpath "/var/snap/wekan/common" --repair >> /root/repairlog.txt
|
||||
|
||||
snap start wekan
|
||||
|
||||
exit
|
||||
```
|
||||
|
||||
Logs from Snap:
|
||||
|
||||
https://github.com/wekan/wekan/issues/5073
|
||||
|
||||
## Repair Docker WeKan
|
||||
|
||||
At step 12 below is actual repair MongoDB command.
|
||||
|
||||
Some customer of [WeKan Commercial Support](https://wekan.team/commercial-support/) ordered restore and repair of WeKan MongoDB database at UCS appliance. This was needed when changing back to previous UCS 4.x major version, when in new major UCS 5.x version Docker containers were all the time crashing and restarting, or something else got broken. Here are commands that were used while repairing.
|
||||
|
||||
Similarly, MongoDB may require repair, if:
|
||||
- MongoDB does not recover from sudden power failure cleanly
|
||||
- Disk comes full, that is worst case. Recommended are daily backups, in this case sometimes repair does not work well enough.
|
||||
|
||||
1. SSH to UCS appliance as root:
|
||||
```
|
||||
ssh root@192.168.0.100
|
||||
```
|
||||
2. If backup or raw database files is at external USB harddrive, look where it is inserted:
|
||||
```
|
||||
ls /dev
|
||||
|
||||
fdisk -l /dev/sdb
|
||||
|
||||
fdisk -l /dev/sdc
|
||||
|
||||
fdisk -l /dev/sdd
|
||||
```
|
||||
2. If external USB drive has NTFS file format, and mount complains about not having NTFS support, install NTFS support to Linux:
|
||||
```
|
||||
apt install ntfs-3g
|
||||
```
|
||||
3. Mount USB drive to /mnt
|
||||
```
|
||||
mount /dev/sdd1 /mnt
|
||||
```
|
||||
4. Stop WeKan Docker containers. If copying raw database files, WeKan and MongoDB should not be running, so that MongoDB would not be even more corrupted. (If MongoDB is running, and you have mongodump backup, you can [Backup with mongorestore](Backup)
|
||||
```
|
||||
docker stop wekan-db wekan-app
|
||||
```
|
||||
5. Find WeKan database raw files. MongoDB has various database engines, like WiredTiger, how to save raw data compressed, or other formats. WiredTiger is file format to save compressed MongoDB data. Similar like MySQL has ISAM, InnoDB etc.
|
||||
```
|
||||
apt -y install mlocate
|
||||
updatedb
|
||||
locate WiredTiger.wt
|
||||
```
|
||||
It can show for example USB drive and Docker container directory:
|
||||
```
|
||||
root@ucs:/mnt/wekan/data/db# locate WiredTiger.wt
|
||||
/mnt/wekan/data/db/WiredTiger.wt
|
||||
/var/lib/univention-appcenter/apps/wekan/data/db/WiredTiger.wt
|
||||
```
|
||||
6. Change to newly installed MongoDB data directory:
|
||||
```
|
||||
cd /var/lib/univention-appcenter/apps/wekan/data/db/
|
||||
```
|
||||
7. Look at directory files owner permissions:
|
||||
```
|
||||
ls -lah
|
||||
```
|
||||
There could be like this:
|
||||
```
|
||||
-rw-r--r-- 1 tss tss 1004 Jan 25 13:09 WiredTiger.turtle
|
||||
-rw-r--r-- 1 tss tss 392K Jan 25 13:09 WiredTiger.wt
|
||||
```
|
||||
8. Move that probably empty newly installed MongoDB data elsewhere:
|
||||
```
|
||||
mkdir /root/new-empty-wekan-data
|
||||
mv * /root/new-empty-wekan-data
|
||||
```
|
||||
9. Copy MongoDB raw database files from USB harddrive to docker container directory:
|
||||
```
|
||||
root@ucs-bdc:/var/lib/univention-appcenter/apps/wekan/data/db# cp -pR /mnt/wekan/data/db/* .
|
||||
```
|
||||
10. Like looked at step 7, change file owner permissions to be correct, and change directory
|
||||
```
|
||||
chown -R tss:tss *
|
||||
cd /root
|
||||
```
|
||||
11. Find mongod command:
|
||||
```
|
||||
locate /usr/bin/mongod
|
||||
```
|
||||
12. Repair Docker WeKan with version of Docker MongoDB that WeKan uses, change mongod path to below. Repairing logged to textfile.
|
||||
```
|
||||
root@ucs:~# /var/lib/docker/overlay2/7b58483a16a2f67ee50486c00ec669940f7a95d460ee8188966fee0096e81fa2/diff/usr/bin/mongod --dbpath "/var/lib/univention-appcenter/apps/wekan/data/db" --repair >> repairlog.txt
|
||||
```
|
||||
13. Look what containers are running:
|
||||
```
|
||||
docker ps
|
||||
```
|
||||
14. Look what containers are not running:
|
||||
```
|
||||
docker ps -a
|
||||
```
|
||||
15. Start MongoDB first:
|
||||
```
|
||||
docker start wekan-db
|
||||
```
|
||||
16. Look what happends at MongoDB container:
|
||||
```
|
||||
docker logs wekan-db
|
||||
```
|
||||
17. Start WeKan next.
|
||||
```
|
||||
docker start wekan-app
|
||||
```
|
||||
18. Look what happends at MongoDB container.
|
||||
```
|
||||
docker logs wekan-app
|
||||
```
|
||||
19. Check are both wekan-db and wekan-app containers running, and not restarting:
|
||||
```
|
||||
docker ps
|
||||
```
|
||||
20. Try to login to WeKan with webbrowser.
|
||||
21. Backup WeKan database now after repair:
|
||||
```
|
||||
docker exec -it wekan-db bash
|
||||
cd /data
|
||||
rm -rf dump
|
||||
mongodump
|
||||
exit
|
||||
docker cp wekan-db:/data/dump .
|
||||
zip -r wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip dump
|
||||
```
|
||||
Now backup is at wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip file.
|
||||
|
||||
22. At your local computer terminal (not at UCS server), transfer file to your local computer with scp:
|
||||
```
|
||||
scp root@192.168.0.100:/root/wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip .
|
||||
```
|
||||
23. Copy backup to external USB harddrive, change YEAR-MONTH-DATE-TIME-HERE to current date and time:
|
||||
```
|
||||
cp /root/wekan-backup-YEAR-MONTH-DATE-TIME-HERE.zip /mnt/
|
||||
```
|
||||
24. Look what drives are mounted:
|
||||
```
|
||||
df -h
|
||||
```
|
||||
25. Sync and save unwritted data to disk, and unmount external USB harddrive safely:
|
||||
```
|
||||
sync
|
||||
umount /dev/sdd1
|
||||
```
|
||||
26. Remove external USB harddisk from server.
|
||||
27. Login to WeKan, check do all WeKan boards work. In this case, all did work.
|
||||
@@ -0,0 +1,15 @@
|
||||
|
||||
```
|
||||
sudo snap stop wekan.wekan
|
||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/snap/wekan/current/lib/x86_64-linux-gnu
|
||||
export PATH2=$PATH
|
||||
export PATH=/snap/wekan/current/bin:$PATH
|
||||
mongodump --port 27019
|
||||
sudo snap get wekan > snap-settings.txt
|
||||
sudo snap stop wekan.mongodb
|
||||
sudo mv /var/snap/wekan/common .
|
||||
sudo mkdir /var/snap/wekan/common
|
||||
sudo snap refresh wekan --channel=latest/candidate
|
||||
```
|
||||
|
||||
To be continued...
|
||||
@@ -0,0 +1,73 @@
|
||||
If you know updates to this, please add new issue about it. Make changes to this page by cloning wiki:
|
||||
|
||||
```
|
||||
git clone https://github.com/wekan/wekan.wiki
|
||||
```
|
||||
There edit Browser-compatibility-matrix.md and attach it with .txt extension or in .zip file to https://github.com/wekan/wekan/wiki/issues
|
||||
|
||||
## Webkit based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Safari | iOS Yes | iOS Newest | Newest | iOS, macOS
|
||||
|
||||
## Firefox based
|
||||
|
||||
Any telemetry at any Firefox based browser can be additionally most locked down with arkenfox user JS.
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
[Mypal](https://releases.wekan.team/mypal/) | No | No | Newest | For 32bit ReactOS/WinXP/Win7/etc [issue](https://github.com/wekan/wekan/issues/3132), Other 32bit browsers probably not
|
||||
Firefox | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Morph Browser | No | Yes | Yes | [Ubuntu Touch](https://ubports.com) (based on Ubuntu 16.04) on PinePhone, OnePlus 3, [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/) (not RasPi4 yet). Works best with bluetooth or USB mouse and keyboard.
|
||||
[OpenStore App](https://open-store.io/app/wekan.wekanteam) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), [Ubuntu Touch](https://ubports.com) app at [OpenStore](https://open-store.io/app/wekan.wekanteam) using Morph browser with Wekan demo & development server https://boards.wekan.team . Tested on [RasPi3](https://ci.ubports.com/job/rootfs/job/rootfs-rpi/). PWA URL is configured here https://github.com/wekan/wekan-openstore/blob/master/wekan.desktop#L3
|
||||
[Waterfox](https://www.waterfox.net) | No | No | Yes | Win/Mac/Linux, more private than Firefox, no tracking
|
||||
[Floorp](https://floorp.app) | No | No | Yes | [Win/Mac/Linux](https://github.com/Floorp-Projects/Floorp/releases), more private than Firefox, [Repo](https://github.com/Floorp-Projects/Floorp)
|
||||
[Mercury](https://thorium.rocks/mercury) | No | No | Yes | [Win/Linux](https://github.com/Alex313031/Mercury/releases), more private than Firefox, [Repo](https://github.com/Alex313031/Mercury)
|
||||
[SeaLion](https://github.com/wicknix/SeaLion) | No | No | Yes | [MacOS 10.7-14.1 x32,x64,ppc,ppc64/Linux x64](https://github.com/wicknix/SeaLion/releases), [Repo](https://github.com/wicknix/SeaLion)
|
||||
[LibreWolf](https://librewolf.net) | No | No | Yes | [Win/Mac/Linux](https://librewolf.net/installation/)
|
||||
|
||||
## Chromium based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Chrome | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Chromium | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Brave | Android Yes | Android Newest | Newest | Win/Mac/Linux/RasPi
|
||||
Vivaldi | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Opera | Android Yes | Android Newest | Newest | Win/Mac/Linux
|
||||
Credge, Chromium Edge | Android Yes | Android | Newest | Win/Mac/Linux/Mobile
|
||||
[Microsoft Store App](https://www.microsoft.com/fi-fi/p/wekan/9p2mrxvd087r#activetab=pivot:overviewtab) | Yes | Yes | Yes | At Microsoft Store of Windows 10/11 desktop, made with [PWABuilder](https://www.pwabuilder.com/). Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), changed app from EdgeHTML to Credge based with Wekan demo & development server https://boards.wekan.team
|
||||
[Android Play Store App](https://play.google.com/store/apps/details?id=team.wekan.boards.twa) | Yes | Yes | Yes | Based on [Wekan PWA](https://boards.wekan.team/b/D2SzJKZDS4Z48yeQH/wekan-open-source-kanban-board-with-mit-license/s7SkzYviC2e963FkT), made with [PWABuilder](https://www.pwabuilder.com/), uses Android Chrome browser with Wekan demo & development server https://boards.wekan.team
|
||||
[Thorium](https://thorium.rocks) | No | Yes | Yes | [Win/Win7/Mac/Linux/Android/RasPi](https://thorium.rocks), speed optimized
|
||||
[Supermium](https://github.com/win32ss/supermium) | No | No | Yes | 32bit: Windows XP, Windows 2003
|
||||
|
||||
## EdgeHTML based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Legacy Edge | No | No | Not | Not compatible with newest WeKan. Worked with Wekan v4.19 and before.
|
||||
|
||||
## MSHTML based
|
||||
|
||||
Browser | [PWA](PWA) | Mobile | Desktop | OS
|
||||
------- | ----| ------ | ------- | -------
|
||||
Internet Explorer | No | No | No | No | No
|
||||
|
||||
## Other ways to create Mobile App with Meteor
|
||||
|
||||
https://guide.meteor.com/cordova
|
||||
|
||||
Benefits:
|
||||
- Can be faster, more stored at mobile
|
||||
- Native features integration possibilities
|
||||
|
||||
## Desktop app with Meteor
|
||||
|
||||
https://forums.meteor.com/t/desktop-electron-meteor-app-with-todesktop/60904
|
||||
|
||||
## Optional Payments
|
||||
|
||||
- If there is sometime a need to develop payment feature, that does not exist yet
|
||||
- https://forums.meteor.com/t/need-help-adding-in-app-purchases-to-a-meteor-app-specifically-adding-subscription-support-for-android-play-store/40510
|
||||
- https://www.npmjs.com/package/cordova-plugin-purchase
|
||||
@@ -0,0 +1,11 @@
|
||||
## FerretDB
|
||||
|
||||
Replacing MongoDB with FerretDB/SQLite or FerretDB/PostgreSQL. Needs testing, what are correct settings.
|
||||
|
||||
https://forums.meteor.com/t/ferretdb-1-18-now-has-oplog-support-trying-replace-mongodb-6-x-with-ferretdb-postgresql-or-ferretdb-sqlite/61092
|
||||
|
||||
## ToroDB
|
||||
|
||||
ToroDB is not developed anymore. ToroDB was about adding MongoDB proxy to PostgreSQL or MySQL.
|
||||
|
||||
https://github.com/wekan/wekan/tree/main/torodb-postgresql
|
||||
@@ -0,0 +1,23 @@
|
||||
### Create card
|
||||
|
||||
At Calendar View, on Month when you click a date it will ask you if you want to create a new card and give its name. It then creates at first swimlane and at first list the card with the due date that it got from the date you clicked.
|
||||
|
||||
Video demonstration:
|
||||
|
||||
https://user-images.githubusercontent.com/70445835/184324324-b4bd466e-6873-4eef-8ca5-b6e4d9f95ac5.mp4
|
||||
|
||||
|
||||
- How it works https://github.com/wekan/wekan/issues/2687#issuecomment-1545235649
|
||||
- Fix for Calendar View Create Card https://github.com/wekan/wekan/pull/5019
|
||||
- Calendar view logic https://github.com/wekan/wekan/issues/4511
|
||||
|
||||
## <a name="Time"></a>Time
|
||||
|
||||
* [Due Date](Due-Date)
|
||||
* [Day of week start](Day-of-week-start)
|
||||
|
||||
## What features are missing
|
||||
|
||||
* [Calendar issues](https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aopen+calendar+label%3AFeature%3ACalendar-view)
|
||||
* [Time Tracking](Time-Tracking)
|
||||
* [Gantt Chart](Gantt)
|
||||
@@ -0,0 +1,7 @@
|
||||
## 1) Click right top your username
|
||||
|
||||
<img src="https://wekan.github.io/day/day_of_week_start_1.png" width="40%" alt="Day of Week Start 1" />
|
||||
|
||||
## 2) Click Change Settings => Set day of the week start => Select first day of the week from dropdown menu
|
||||
|
||||
<img src="https://wekan.github.io/day/day_of_week_start_2.png" width="40%" alt="Day of Week Start 1" />
|
||||
@@ -0,0 +1,5 @@
|
||||
|
||||
- received - when a bug or task is found
|
||||
- start - when work is started
|
||||
- due - when it should be done
|
||||
- end - when it's done
|
||||
@@ -0,0 +1,19 @@
|
||||
## Time Tracking
|
||||
|
||||
This was found 2020-05-20 at [Time Tracking Wekan issue](https://github.com/wekan/wekan/issues/812#issuecomment-631111730), thanks!
|
||||
|
||||
Titra Time Tracking, GPLv3
|
||||
- https://titra.io/en/free-time-tracking-online/
|
||||
- https://github.com/kromitgmbh/titra/
|
||||
|
||||
Wekan Integration:
|
||||
- https://github.com/kromitgmbh/titra/wiki/Wekan-integration
|
||||
|
||||
|
||||
***
|
||||
|
||||
## iCal
|
||||
|
||||
https://github.com/wekan/wekan/issues/2836
|
||||
|
||||
https://github.com/wekan/wekan-ical-server
|
||||
@@ -0,0 +1,38 @@
|
||||
1. At Windows, sync to ntp timeserver. Examples:
|
||||
- `time.windows.com`
|
||||
- `ntp.ubuntu.com`
|
||||
- `ntp1.kolumbus.fi`
|
||||
|
||||
2. Dual boot to Qubes OS. At desktop top right calendar/time, set timezone to Etc/UTC.
|
||||
|
||||
3. At server and it's KVM VMs, edit `/etc/timezone` to `Etc/UTC`.
|
||||
|
||||
4. Update time at server:
|
||||
|
||||
```
|
||||
sudo apt -y install ntpdate
|
||||
|
||||
sudo ntpdate ntp.ubuntu.com
|
||||
```
|
||||
|
||||
5. Now local time shows correctly at webbrowser, like for example at Friend Desktop https://github.com/wekan/wekan/wiki/Friend
|
||||
|
||||
For testing any other time related code, that it shows correct local time, compare time functions results to this:
|
||||
|
||||
https://github.com/FriendUPCloud/friendup/blob/master/interfaces/web_desktop/apps/Convos/Scripts/chatlog.fui.js#L694
|
||||
|
||||
From Hogle Titlestad:
|
||||
|
||||
> Oh, and the most important thing.
|
||||
> The first argument is a time string.
|
||||
> Seconds. Not a normal date.
|
||||
> Such that you can subtracck and add seconds to it.
|
||||
> So input would be:
|
||||
> ```
|
||||
> this.parseDate( 1695981700956, false, 'Europe/Oslo' );
|
||||
> ```
|
||||
> e.g. Europe/Oslo is the server time zone.
|
||||
> The timestamp is server time.
|
||||
> For the event in question.
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
# Also see Snap Developer Docs
|
||||
|
||||
[Snap Developer Docs](https://github.com/wekan/wekan-snap/wiki/Snap-Developer-Docs)
|
||||
|
||||
# When adding settings to code you or somebody else wrote
|
||||
|
||||
Add all necessary settings that you find on code.
|
||||
|
||||
After doing all changes, [fix lint errors](Developer-Documentation#preventing-travis-ci-lint-errors-before-submitting-pull-requests) and if possible warnings too. You can silence errors if you really can't find solution.
|
||||
|
||||
Submit pull request to Wekan edge branch https://github.com/wekan/wekan/tree/edge
|
||||
|
||||
# Changes to server code
|
||||
|
||||
To use environment variables in your serverside code, use:
|
||||
```
|
||||
process.env.YOURSETTING
|
||||
```
|
||||
Example: [wekan/server/policy.js](https://github.com/wekan/wekan/blob/edge/server/policy.js)
|
||||
|
||||
# Changes to [config](https://github.com/wekan/wekan/blob/edge/snap-src/bin/config)
|
||||
|
||||
## 1) Add to beginning
|
||||
|
||||
At beginning there is this line:
|
||||
```
|
||||
# list of supported keys
|
||||
keys="MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP ..."
|
||||
```
|
||||
To the end of it, add name of new setting. For example:
|
||||
```
|
||||
keys="... AWESOME_FEATURE_ENABLED"
|
||||
```
|
||||
|
||||
## 2) Add to bottom
|
||||
|
||||
Example 1: Set features not enabled as default.
|
||||
```
|
||||
DESCRIPTION_LDAP_ENABLED="LDAP enabled. Default: false"
|
||||
DEFAULT_LDAP_ENABLED="false"
|
||||
KEY_LDAP_ENABLED="ldap-enabled"
|
||||
```
|
||||
Example 2: If setting is different for every server, leave it empty.
|
||||
```
|
||||
DESCRIPTION_OAUTH2_TOKEN_ENDPOINT="OAuth2 token endpoint. Example: /oauth/token"
|
||||
DEFAULT_OAUTH2_TOKEN_ENDPOINT=""
|
||||
KEY_OAUTH2_TOKEN_ENDPOINT="oauth2-token-endpoint"
|
||||
```
|
||||
Example 3: If there is same for every server, set it to general setting.
|
||||
```
|
||||
DESCRIPTION_LDAP_SEARCH_FILTER="LDAP search filter. Default: (&(objectCategory=person)(objectClass=user)(!(cn=andy)))"
|
||||
DEFAULT_LDAP_SEARCH_FILTER="(&(objectCategory=person)(objectClass=user)(!(cn=andy)))"
|
||||
KEY_LDAP_ENABLED="ldap-enabled"
|
||||
```
|
||||
Example 4: If you don't know example, leave it without example.
|
||||
```
|
||||
DESCRIPTION_TURBO_FILTER="Turbo filter. Default: ''"
|
||||
DEFAULT_TURBO_FILTER=""
|
||||
KEY_TURBO_FILTER="turbo-filter"
|
||||
```
|
||||
|
||||
# Changes to [Snap help](https://github.com/wekan/wekan/blob/edge/snap-src/bin/wekan-help)
|
||||
|
||||
## 1) How to quote examples
|
||||
|
||||
Snap settings need to be lowercase, and inside single quotes. For example:
|
||||
```
|
||||
snap set wekan ldap-user-search-filter='(&(objectCategory=person)(objectClass=user)(!(cn=andy)))'
|
||||
```
|
||||
The setting inside single quotes is the actual setting.
|
||||
|
||||
Actual settings can include double quotes, spaces, etc, but not single quotes. For example:
|
||||
```
|
||||
snap set wekan ldap-user-search-filter='"(&(objectCategory=person)(objectClass=user)(!(cn=andy)))"'
|
||||
```
|
||||
|
||||
## 2) What to add as setting to Wekan help
|
||||
|
||||
Example 1:
|
||||
```
|
||||
echo -e "OAuth2 Token Endpoint. Example: /oauth/token"
|
||||
echo -e "To enable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT='/oauth/token'"
|
||||
echo -e "\t-Disable the OAuth2 Token Endpoint of Wekan:"
|
||||
echo -e "\t$ snap set $SNAP_NAME OAUTH2_TOKEN_ENDPOINT=''"
|
||||
echo -e "\n"
|
||||
```
|
||||
So all you add need to be above of this line:
|
||||
```
|
||||
# parse config file for supported settings keys
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
- https://www.sitepoint.com/javascript-async-await/
|
||||
- https://www.freecodecamp.org/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream/
|
||||
- https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous
|
||||
@@ -0,0 +1,204 @@
|
||||
## About markdown changes
|
||||
|
||||
Wekan v4.29 changes markdown rendering from [marked](https://github.com/markedjs/marked) to [markdown-it](https://github.com/markdown-it/markdown-it).
|
||||
|
||||
## About emoji
|
||||
|
||||
With markdown-it, also [markdown-it-emoji](https://github.com/markdown-it/markdown-it-emoji) plugin has been added, supporting [full list of GitHub emojis](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.json).
|
||||
|
||||
Example emoji code, that you can add for example to card name, card description etc:
|
||||
```
|
||||
:rainbow: :thumbsup: :100:
|
||||
```
|
||||
That shows emojis :rainbow: :thumbsup: :100:
|
||||
|
||||
## About other markdown-it plugins
|
||||
|
||||
For markdown-it, there are also other [syntax extensions](https://github.com/markdown-it/markdown-it#syntax-extensions) where some are listed at that markdown-it page, and [others at npmjs.com](https://www.npmjs.org/browse/keyword/markdown-it-plugin).
|
||||
|
||||
For example, how to get some [mermaid plugin](https://www.npmjs.com/search?q=markdown-it-mermaid) working so that some syntax works for https://mermaid-js.github.io/mermaid/ ?
|
||||
|
||||
## How you could add another plugin
|
||||
|
||||
Using newest Ubuntu amd64:
|
||||
|
||||
# Meteor 2
|
||||
|
||||
### 1. Install git and configure it
|
||||
```
|
||||
sudo apt -y install git
|
||||
|
||||
git config --global user.name "Yourfirstname Yourlastname"
|
||||
|
||||
git config --global user.email email-address-you-use-at-github@example.com
|
||||
|
||||
git config --global push.default simple
|
||||
|
||||
nano .ssh/config
|
||||
```
|
||||
There add your User (GitHub username) and IdentityFile (Your ssh private key. Not public key that has .pub).
|
||||
For indentation, use one tab.
|
||||
```
|
||||
Host *
|
||||
IdentitiesOnly=yes
|
||||
|
||||
Host github.com
|
||||
Hostname github.com
|
||||
User xet7
|
||||
IdentityFile ~/.ssh/id_xet7ed
|
||||
```
|
||||
Save and Exit with Ctrl-o Enter Ctrl-x Enter
|
||||
|
||||
If you do not have ssh key, create it:
|
||||
```
|
||||
ssh-keygen
|
||||
```
|
||||
And press Enter about 3 times, until you have private key at `~/.ssh/id_rsa` and public key at `~/.ssh/id_rsa.pub`
|
||||
|
||||
Add public key `.pub` to your github account web interface.
|
||||
|
||||
Add path to Meteor:
|
||||
```
|
||||
nano .bashrc
|
||||
```
|
||||
There at bottom add:
|
||||
```
|
||||
export PATH=~/.meteor:$PATH
|
||||
```
|
||||
Save and Exit with Ctrl-o Enter Ctrl-x Enter
|
||||
|
||||
### 2. Create fork of `https://github.com/wekan/wekan` at GitHub web page
|
||||
|
||||
```
|
||||
mkdir repos
|
||||
|
||||
cd repos
|
||||
|
||||
git clone git@github.com:YourGithubUsername/wekan.git
|
||||
|
||||
cd wekan
|
||||
```
|
||||
### 3. Select option 1 to install dependencies, and then Enter.
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
1
|
||||
|
||||
./rebuild-wekan.sh
|
||||
|
||||
2
|
||||
|
||||
./rebuild-wekan.sh
|
||||
|
||||
3
|
||||
```
|
||||
That does: 1 install dependencies, 2 builds wekan, 3 starts wekan in development mode with command `meteor`, so it can detect if some file changes and try to rebuild automatically and reload webbroser. But, still sometimes, it may need stopping with Ctrl-c and full build with option 2.
|
||||
|
||||
And then [register and login](Adding-users) at http://localhost:4000
|
||||
|
||||
### OPTIONAL, NOT NEEDED: 5. Add new plugin package
|
||||
```
|
||||
meteor npm install markdown-it-something --save
|
||||
```
|
||||
|
||||
Edit file `wekan/packages/markdown/src-integration.js` and add using that new package, using code example from that new plugin page, or similar like emoji plugin was added.
|
||||
|
||||
### 7. Test
|
||||
|
||||
Test does that new plugin syntax work, for example in card title, card description etc on other input fields.
|
||||
|
||||
### 8. If it works, create pull request
|
||||
|
||||
If normal markdown, emoji, and your new added plugin syntax all work, commit your changes:
|
||||
```
|
||||
git add --all
|
||||
|
||||
git commit -m "Added plugin markdown-it-something."
|
||||
|
||||
git push
|
||||
```
|
||||
And then at your GitHub for `https://github.com/YOUR-GITHUB-USERNAME/wekan` click `Create pull request`.
|
||||
|
||||
# Meteor 3
|
||||
|
||||
At 2024-06-26, it looks like from https://nodejs.org/en that Node.js LTS version is 20.15.0 , so change to newest Node.js LTS, delete old Meteor:
|
||||
```
|
||||
sudo n 20.15.0
|
||||
|
||||
sudo npm -g install npm
|
||||
|
||||
cd
|
||||
|
||||
rm -rf .meteor
|
||||
```
|
||||
Check how to install newest Meteor from Meteor 3 PR at https://github.com/meteor/meteor/pull/13163 , for example:
|
||||
```
|
||||
npx meteor@rc
|
||||
```
|
||||
Check what branches there are:
|
||||
```
|
||||
cd repos/wekan
|
||||
|
||||
git branch -a
|
||||
```
|
||||
Change to Meteor 3 branch:
|
||||
```
|
||||
git checkout feature-meteor3
|
||||
```
|
||||
Build wekan:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
2
|
||||
```
|
||||
If there are errors, try to fix them.
|
||||
|
||||
Or try to run wekan:
|
||||
```
|
||||
./rebuild-wekan.sh
|
||||
|
||||
3
|
||||
```
|
||||
# Updating
|
||||
|
||||
There are usually updates both for npm packages and Meteor
|
||||
|
||||
Updating npm packages:
|
||||
```
|
||||
npm update
|
||||
```
|
||||
Checking for vulnerable packages:
|
||||
```
|
||||
npm audit
|
||||
```
|
||||
Fixing vulnerable npm packages by updating to newer packages:
|
||||
```
|
||||
npm audit fix
|
||||
```
|
||||
If that did not help, use force:
|
||||
```
|
||||
npm audit fix --force
|
||||
```
|
||||
If that did not help, read links from that `npm audit` command did show, remove deprecated dependencies, update to other maintained dependencies.
|
||||
|
||||
Updating to next Meteor release:
|
||||
```
|
||||
meteor update
|
||||
```
|
||||
Updating to specific Meteor release:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4
|
||||
```
|
||||
Trying to update all Meteor packages:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4 --all-packages
|
||||
```
|
||||
Allowing incompatible updates, that may sometime work:
|
||||
```
|
||||
meteor update --release METEOR@3.0-rc.4 --all-packages --allow-incompatible-update
|
||||
```
|
||||
If you are changing Meteor and Node.js versions, you may need to reset Meteor:
|
||||
```
|
||||
meteor reset
|
||||
```
|
||||
Or alternatively, delete wekan repo (if you did not need any changes you made), and clone wekan repo again, and then build etc.
|
||||
@@ -0,0 +1,115 @@
|
||||
## Maximum Call Stack Size Exceeded
|
||||
|
||||
https://github.com/wekan/wekan/issues?q=is%3Aissue+maximum+call+stack+is%3Aclosed
|
||||
|
||||
https://stackoverflow.com/questions/75869629/ios-websocket-close-and-error-events-not-firing
|
||||
|
||||
This can happen, when there is too much or incompatible code at browserside, for example at iOS Safari.
|
||||
|
||||
To fix it:
|
||||
|
||||
1. Move ExcelJS from browserside to run at serverside https://github.com/wekan/wekan/pull/3871
|
||||
2. Use Bundle Visualizer to see what is the size of dependencies, and try what can be moved to serverside like at step 1, that bundle visualizer is used in this script https://github.com/wekan/wekan/blob/main/rebuild-wekan.sh
|
||||
```
|
||||
meteor run --exclude-archs web.browser.legacy,web.cordova --port 4000 --extra-packages bundle-visualizer --production 2>&1 | tee ../log.txt
|
||||
```
|
||||
3. Make dependencies smaller. For example, use only required files, and do not include all dependencies: https://github.com/wekan/wekan/commit/23e5e1e3bd081699ce39ce5887db7e612616014d . In that commit, package was forked to packages directory, then renamed, and added with `meteor add packagename`, where package name does not have character `:`
|
||||
4. Use Browserstack.com to see errors at browser / inspect / console, or use iOS or other device emulators, to see error messages. Testing at real device is more important, because they could work differently than emulators, emulators sometimes do not emulate all same features. Those error messages have file where error happened, and line number, like `something.js:301` . From there, scroll up a little, look at what function or what package dependency it is where it happened. If possible, try to move that package serverside, like at step 1. Or alternatively, look is it possible to remove or change to some other compatible dependency.
|
||||
5. See what are the dependencies at your Meteor based software, compared to WeKan dependencies that are usually already upgraded to newest Meteor, is there any differences where changing to correct dependencies could help you to upgrade to newest Meteor:
|
||||
- https://github.com/wekan/wekan/blob/main/package.json
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/packages
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/versions
|
||||
- https://github.com/wekan/wekan/blob/main/.meteor/release
|
||||
5. If you get some errors, search are those same already fixed in WeKan/Meteor/RocketChat, could you fix them same way:
|
||||
- https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
- https://github.com/wekan/wekan/issues
|
||||
- https://github.com/wekan/wekan/issues?q=is%3Aissue+is%3Aclosed
|
||||
- https://github.com/meteor/meteor/issues
|
||||
- https://github.com/meteor/meteor/issues?q=is%3Aissue+is%3Aclosed
|
||||
- https://github.com/RocketChat/Rocket.Chat/issues
|
||||
- https://github.com/RocketChat/Rocket.Chat/issues?q=is%3Aissue+is%3Aclosed
|
||||
6. If you have some webserver providing SSL/TLS, check that you have websockets enabled:
|
||||
- https://github.com/wekan/wekan/wiki/Caddy-Webserver-Config
|
||||
- https://github.com/wekan/wekan/wiki/Nginx-Webserver-Config
|
||||
- https://github.com/wekan/wekan/wiki/Apache
|
||||
- OpenLiteSpeed https://github.com/wekan/wekan/issues/3334#issuecomment-723651328
|
||||
- https://github.com/wekan/wekan/wiki/Local-self-signed-TLS
|
||||
- https://github.com/wekan/wekan/wiki/Traefik-and-self-signed-SSL-certs
|
||||
|
||||
## OLD: TODO
|
||||
|
||||
[Quote from advise](https://github.com/meteor/meteor/issues/9796#issuecomment-443520767):
|
||||
|
||||
> Identify the core service your app is providing and make sure it is running independently. Put everything non-critical, including reporting, on some other system.
|
||||
|
||||
[Look at scaling tips here](https://github.com/meteor/meteor/issues/9796#issuecomment-411373831), quote:
|
||||
|
||||
> smeijer commented 25 days ago
|
||||
> Just wanted to let know that I haven't experienced this issue anymore since I've replaced a lot of `meteor publications` with `apollo/graphql requests`.
|
||||
>
|
||||
> The reactivity is thereby lost, but in my case a 30sec poll is also fine. On the places that I do require reactivity, I only `publish` a single `timestamp`. This timestamp is passed through to `apollo`, which triggers a `refetch` when the timestamp is changed.
|
||||
>
|
||||
> The [discussion here](https://forums.meteor.com/t/implementing-livedocument-as-an-alternative-to-livequery-discussion/40152) has also been helpfull to improve performance here and there.
|
||||
|
||||
[Rocket.Chat scaling tips](https://rocket.chat/docs/installation/manual-installation/multiple-instances-to-improve-performance/)
|
||||
|
||||
## Kadira
|
||||
|
||||
- https://github.com/edemaine/kadira-compose
|
||||
- https://github.com/meteor/meteor-apm-agent
|
||||
- https://github.com/kadira-open/kadira-server
|
||||
- https://www.gethappyboards.com/2017/07/rolling-out-your-own-instance-of-kadira/
|
||||
|
||||
## Finding memory leaks
|
||||
|
||||
**[Collect a heap profile and then analyze it](https://github.com/v8/sampling-heap-profiler)**
|
||||
|
||||
[Older article: How to Self Detect a Memory Leak in Node](https://www.nearform.com/blog/self-detect-memory-leak-node/)
|
||||
|
||||
## 100% CPU usage
|
||||
|
||||
1) Increase ulimit system wide to 100 000 in systemd config.
|
||||
|
||||
2) Wekan Javascript code has [increaded fiber poolsize](https://github.com/wekan/wekan/blob/main/server/authentication.js#L5-L9).
|
||||
|
||||
3) There is [on-going 100% CPU usage Meteor issue](https://github.com/meteor/meteor/issues/9796#issuecomment-400079380) and hopefully [fixes to Node.js will land in Node v8.12](https://github.com/nodejs/node/pull/21593#issuecomment-403636667) sometime. Node 8.12 is now released and official version included at Wekan.
|
||||
|
||||
## Scaling to thousands of users
|
||||
|
||||
[Production setup at AWS](AWS)
|
||||
|
||||
## Current versions of dependencies
|
||||
|
||||
[Dockerfile](https://github.com/wekan/wekan/blob/main/Dockerfile), versions of Meteor.js, Node etc listed at beginning.
|
||||
|
||||
[Included Meteor packages](https://github.com/wekan/wekan/blob/main/.meteor/packages)
|
||||
|
||||
[Included Meteor package versions](https://github.com/wekan/wekan/blob/main/.meteor/versions)
|
||||
|
||||
[Added packages at package.json](https://github.com/wekan/wekan/blob/main/package.json)
|
||||
|
||||
## Build from source
|
||||
|
||||
Wekan:
|
||||
- On any x64 hardware that has Ubuntu 14.04 or Debian 9 or newer installed directly or in VM:
|
||||
[Build from source scripts](https://github.com/wekan/wekan-maintainer/tree/master/virtualbox)
|
||||
|
||||
Wekan for Sandstorm:
|
||||
- Install above Wekan from source
|
||||
- Install [Sandstorm locally](https://sandstorm.io/install) with `curl https://install.sandstorm.io | bash`, select dev install
|
||||
- Install [meteor-spk](https://github.com/sandstorm-io/meteor-spk)
|
||||
- Get 100% CPU issue fibers fixed node, and copy it to spk directory:<br />
|
||||
`wget https://releases.wekan.team/node`<br />
|
||||
`chmod +x node`<br />
|
||||
`mv node ~/projects/meteor-spk/meteor-spk-0.4.0/meteor-spk.deps/bin/`
|
||||
- Add to your /home/username/.bashrc : <br /> `export PATH=$PATH:$HOME/projects/meteor-spk/meteor-spk-0.4.0`
|
||||
- Close and open your terminal, or read settings from .bashrc with<br />`source ~/.bashrc`
|
||||
- `cd wekan && meteor-spk dev`
|
||||
- Then Wekan will be visible at local sandstorm at http://local.sandstorm.io:6080/
|
||||
- Sandstorm commands: `sudo sandstorm`. [Release scripts](https://github.com/wekan/wekan-maintainer/tree/master/releases). Official releases require publishing key that only xet7 has.
|
||||
|
||||
Docker:
|
||||
- `git clone https://github.com/wekan/wekan`
|
||||
- `cd wekan`
|
||||
- Edit docker-compose.yml script ROOT_URL etc like documented at https://github.com/wekan/wekan-mongodb docker-compose.yml script
|
||||
- `docker-compose up -d --build`
|
||||
@@ -0,0 +1,136 @@
|
||||
## WeKan Interview 2023-12-08 starts at 22min 22sec
|
||||
|
||||
https://www.youtube.com/watch?v=ke-mbnZM3zE
|
||||
|
||||
## Screenshot of Meteor WeKan
|
||||
|
||||
<img src="https://wekan.github.io/wekan-dark-mode.png" width="100%" alt="Meteor WeKan screenshot" />
|
||||
|
||||
## Description of Meteor WeKan
|
||||
|
||||
- WeKan Open Source kanban with MIT license.
|
||||
- Translated to 70+ languages https://explore.transifex.com/wekan/wekan/
|
||||
- Used in most countries of the world https://snapcraft.io/wekan
|
||||
- Biggest user have about 30k users, using many pods at Kubernetes
|
||||
- Changelog https://github.com/wekan/wekan/blob/main/CHANGELOG.md
|
||||
- Commercial Support at https://wekan.team/commercial-support/ . Currently looking who could sponsor more of maintenance and development.
|
||||
|
||||
## How much effort to create Meteor WeKan, in COCOMO model
|
||||
|
||||
- WeKan 134k lines of code: 34 years of effort, 316 contributors https://openhub.net/p/wekan
|
||||
- Meteor.js, 224k lines of code: 59 years of effort, 819 contributors https://openhub.net/p/meteor-js
|
||||
- Since December 2016, WeKan maintainer https://github.com/xet7 :
|
||||
- has added and removed about 4M lines of code https://github.com/wekan/wekan/graphs/contributors
|
||||
- https://openhub.net/accounts/xet7
|
||||
|
||||
## Meteor WeKan Browser support
|
||||
|
||||
- Javascript enabled Desktop and Mobile Safari/Chromium/Firefox based browsers
|
||||
- Apps at Play Store, Windows Microsoft Store, Ubuntu Touch OpenStore https://github.com/wekan/wekan/wiki/Browser-compatibility-matrix
|
||||
- Alternatively, for self-hosted WeKan, create PWA icon https://github.com/wekan/wekan/wiki/PWA
|
||||
- Using WeKan with big touchscreen https://github.com/wekan/wekan/wiki/Touch-Screen-support
|
||||
|
||||
## Meteor WeKan Server
|
||||
|
||||
- Meteor.js 2.x, Node.js 14.x https://github.com/wekan/node-v14-esm/releases/tag/v14.21.4 , MongoDB 6.x
|
||||
- CPU: amd64, arm64, s390x, Source Bundle at https://github.com/wekan/wekan/wiki/Raspberry-Pi
|
||||
- Windows On-Premise: https://github.com/wekan/wekan/wiki/Offline
|
||||
- Mac: Docker, or at https://github.com/wekan/wekan/wiki/Mac
|
||||
- Newest at platforms: Source Bundle, Snap Candidate, Docker, Kubernetes https://wekan.github.io
|
||||
- Platforms that will be updated to be up-to-date: Snap Stable, Sandstorm, UCS https://wekan.github.io
|
||||
|
||||
## Meteor WeKan Features
|
||||
|
||||
- [WeKan Design Principles](https://github.com/wekan/wekan/wiki/Design-Principles)
|
||||
- Realtime UI. When someone makes change, like drag card or add text, everyone will see changes immediately. This is because Meteor listens to MongoDB change stream, and updates UI. For some rare cases, there needs to be reload of page, those need to be fixed.
|
||||
- Whitelabel: Change product name and product image at login screen and board left top corner. Not changing favicon, because there are 100+ favicons for different devices.
|
||||
- Drag Drop at Desktop and Mobile:
|
||||
- Board Icons, Swimlanes, Lists, Cards, Checklists, Checklist Items
|
||||
- Drag handles, per screen https://github.com/wekan/wekan/wiki/Drag-Drop
|
||||
- Some features similar to Trello and Jira. Some features not in Trello and Jira.
|
||||
- IFTTT Rules like Trello Butler https://github.com/wekan/wekan/wiki/IFTTT , translated to all supported languages. Trello Butler is only In English.
|
||||
- Many Assignees like in Jira.
|
||||
- Change background image and Card Cover. Change Theme. Change color of Boards, Swimlane, List, Card, Label.
|
||||
- Markdown at: Board name and description, Swimlane, List, Card title and description, Checklist and Checklist Item, Subtask title, https://github.com/wekan/wekan/wiki/Wekan-Markdown
|
||||
- Emoji https://github.com/wekan/wekan/wiki/Emoji
|
||||
- MathML
|
||||
- Preview card attachment image and PDF
|
||||
- Show Start at End Dates of card at Calendar of Swimlanes/Lists/Calendar dropdown menu
|
||||
- Custom Fields https://github.com/wekan/wekan/wiki/Custom-Fields
|
||||
- Subtasks https://github.com/wekan/wekan/wiki/Subtasks
|
||||
- Planning Poker / Scrum Poker at Card https://github.com/wekan/wekan/wiki/Planning-Poker . No other card games yet ;)
|
||||
- For board actions, like move card etc, Per Board and Global Outgoing and 2-way webhooks to Chat (RocketChat, Slack, Discord etc), NodeRED, or PHP webhook receiver like https://github.com/wekan/webhook
|
||||
- At top right username menu:
|
||||
- Search All Boards, with search options
|
||||
- Public Boards. Board can be set private or public. At Admin Panel is option to disable public boards, so all boards are private.
|
||||
- Change Language
|
||||
- My Cards and Due Cards: Show cards where you are member or assignee, from all boards
|
||||
- At top of current board:
|
||||
- Filter cards, by user etc
|
||||
- Multi-Selection, checkmark and drag many cards at once
|
||||
- Sort current board
|
||||
- Python and PHP based additional features https://github.com/wekan/wekan/wiki/Python
|
||||
- Admin Panel:
|
||||
- Organizations/Teams/People. Impersonate User, logged to database when someone uses that feature.
|
||||
- Customize Translations https://github.com/wekan/wekan/wiki/Customize-Translations
|
||||
|
||||
## Technical details
|
||||
|
||||
- Reactive Cache
|
||||
- mfilser tested speed improvement for half a year, and finally made huge PR to WeKan v7.00 to make all of WeKan use Reactive cache https://github.com/wekan/wekan/pull/5014
|
||||
- Reactive Cache Repo https://github.com/wekan/meteor-reactive-cache , xet7 updated dependencies
|
||||
- Big performance improvements https://github.com/wekan/wekan/issues/5000
|
||||
- Using same style of API for client and serverside
|
||||
- Use more ReactiveCache than MiniMongo
|
||||
- Optimizing and Debugging Meteor, reducing size, links to WeKan dependencies https://github.com/wekan/wekan/wiki/Debugging
|
||||
- Custom OIDC/OAuth2 login
|
||||
- Repo https://github.com/wekan/wekan/tree/main/packages/wekan-oidc
|
||||
- Features:
|
||||
- At Admin Panel, you can change text of login page button `Login with OIDC`
|
||||
- Auth0 https://github.com/wekan/wekan/wiki/OAuth2#auth0 . This did take about half year to implement by xet7, was not available anywhere else for Meteor.
|
||||
- Oracle OIM. https://github.com/wekan/wekan/wiki/Oracle-OIM . For this, customer provided some code. xet7 added fix to make login work even when some login field was missing data, by taking data from other field, all this while xet7 did not have access to customers Oracle OIM, just guessing about what code to add, and it worked.
|
||||
- GitLab https://github.com/wekan/wekan/wiki/OAuth2#gitlab-providing-oauth2-login-to-wekan
|
||||
- RocketChat https://github.com/wekan/wekan/wiki/OAuth2#rocketchat-providing-oauth2-login-to-wekan
|
||||
- Nextcloud https://github.com/wekan/wekan/wiki/Nextcloud
|
||||
- ADFS 4.0 using OAuth2 and OpenID https://github.com/wekan/wekan/wiki/ADFS
|
||||
- Azure https://github.com/wekan/wekan/wiki/Azure
|
||||
- Keycloak https://github.com/wekan/wekan/wiki/Keycloak
|
||||
- Google login https://github.com/wekan/wekan/wiki/Google-login
|
||||
- Custom LDAP
|
||||
- LDAP https://github.com/wekan/wekan/wiki/LDAP
|
||||
- LDAP AD Simple Auth https://github.com/wekan/wekan/wiki/LDAP-AD-Simple-Auth
|
||||
- Default board for users https://github.com/wekan/wekan/pull/5098
|
||||
- Brute Force Accounts Lockout https://github.com/wekan/wekan/wiki/Accounts-Lockout
|
||||
- Markdown, Emoji, MathML, sanitizing https://github.com/wekan/wekan/blob/main/packages/markdown/src/template-integration.js
|
||||
- Many security fixes from Responsible Disclosure https://wekan.github.io/hall-of-fame/
|
||||
|
||||
## Upcoming Features
|
||||
|
||||
- CAS https://github.com/wekan/wekan/wiki/CAS
|
||||
- SAML https://github.com/wekan/wekan/wiki/SAML
|
||||
|
||||
## Video
|
||||
|
||||
- Creator of WeKan, mquandalle (Maxime Quandalle) https://www.youtube.com/watch?v=N3iMLwCNOro
|
||||
- https://github.com/wekan/wekan/wiki/FAQ#what-was-wekan-fork--wefork
|
||||
- Maintainer of WeKan since December 2016, xet7 (Lauri Ojansivu), about WeKan Multiverse at EU NGI Dapsi https://www.youtube.com/watch?v=BPPjiZHVeyM . More about Multiverse at https://github.com/wekan/wekan/wiki/WeKan-Multiverse-Roadmap
|
||||
|
||||
## Maybe?
|
||||
|
||||
- https://github.com/frozeman/meteor-persistent-minimongo2
|
||||
|
||||
## Upcoming upgrades to Meteor 3.0
|
||||
|
||||
- This Week in MeteorJS: 22 September 2023 https://www.youtube.com/watch?v=UWVL1xUP9r0
|
||||
- There Jan Dvorak IV https://github.com/StorytellerCZ commented chat: "We should do deep dive into WeKan!"
|
||||
- So here is The Deep Dive!
|
||||
- Questions for upcoming "This Week in MeteorJS", some already mentioned to be upcoming:
|
||||
- How to upgrade dependencies to Meteor 3.0 ? Some answer was to mention Meteor version at package dependency:
|
||||
<img src="https://wekan.github.io/upgrade-meteor3-new.png" width="100%" alt="Meteor 3.0 upgrading dependencies" />
|
||||
- But what if adding dependency adds some more error messages? Probably that depends on error message, like here when
|
||||
trying to upgrade to Meteor 3.0 alpha 15: https://github.com/wekan/wekan/issues/5142
|
||||
- https://forums.meteor.com/t/my-journey-towards-meteor-3-0/60001/23
|
||||
- https://github.com/bratelefant/Meteor-Files
|
||||
- https://github.com/bratelefant/meteor-roles
|
||||
- https://github.com/bratelefant/meteor-multitenancy
|
||||
|
||||
Loaded 100 of 617 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user